此代码:
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0));
}];
NSLog(@"%@", self.scrollView);
结果是:<UIScrollView: 0x7faad400cc00; frame = (0 0; 0 0)
但是这段代码:
[self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0));
}];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@", self.scrollView);
});
结果是:<UIScrollView: 0x7ff8d1043200; frame = (0 0; 375 667);
为什么我不能立即获得框架,但我可以在0.1秒后获得?
答案 0 :(得分:2)
Masonry是自动布局的包装器,自动布局会在- (void)layoutSubviews;
方法中计算自己的帧,只有在此之后你才能获得所有视图的帧。
砌筑方法mas_makeConstraints
和类似的设置不再有约束。
如果你需要更新约束,你必须调用mas_remakeConstraints:
它只是更新约束,对于更新视图帧,我们必须调用方法setNeedsLayout
来设置关于在下一个显示周期中重新计算的标志,如果我们想要立即更新帧,我们必须调用layoutIfNeeded
方法。
答案 1 :(得分:0)
只是因为您正在更改视图中的视图约束/布局。如果您完全理解了块的作用,您将知道问题的答案。
程序将从代码的第一行开始运行,并通过NSLog
方法行,并且块内的代码将在NSLog
行之前首先调用,或者在NSLog
行之后调用。 NSLog
行。正如你所说,你可以在 0.1秒之后获得框架。再次,这是因为块内的代码比class File(QObject):
def __init__(self, fileName, commentsStatus, diagnosisStatus, parent=None):
QObject.__init__(self, parent)
self.fileName = fileName
self.commentsStatus = commentsStatus
self.diagnosisStatus = diagnosisStatus
class DisplayComponent(QObject):
def __init__(self, parent = None):
QObject.__init__(self, parent)
self.list = [File("file 1", True, False), File("file 2", False, True)]
@pyqtProperty(QQmlListProperty)
def getDicomFilesList(self):
return QQmlListProperty(File, self, self.list)
行更慢。