为什么我在使用砖石时无法立即获得框架?

时间:2017-09-24 06:35:05

标签: ios objective-c

此代码:

[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秒后获得?

2 个答案:

答案 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) 行更慢。