这段代码:
[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 秒后获取?
最佳答案
Masonry 是自动布局的包装器,自动布局在 - (void)layoutSubviews;
方法中计算自己的框架,只有在那之后你才能获得所有 View 的框架。
砌体方法 mas_makeConstraints
和类似的只是设置约束。
如果你需要更新约束,你必须调用mas_remakeConstraints:
它只是更新约束,为了更新 View 的框架,我们必须调用方法setNeedsLayout
来设置一个关于重新计算的标志在下一个显示周期中,如果我们想立即更新帧,我们必须调用 layoutIfNeeded
方法。
关于ios - 为什么我用masonry的时候不能立马拿到相框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46387298/