Masonry,一款制造UI布局的利器,相信不少iOS开发者都了解或使用过。然而笔者在使用过程中偶然发现,在模拟器里部分视图的约束不起作用甚至数值出错导致布局错乱,而在真机里却能正常显示。
后来查了一手资料,找到了解决方法,如下:
[self.view layoutIfNeeded];
给视图设定完约束后加上如上一行代码即可。
完整示例如下:
[self.view addSubview:self.timeLabel];
[self setNeedsUpdateConstraints];
[self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
...
}];
[self updateConstraints]; // 重写updateConstraints函数就用super
[self.view layoutIfNeeded];
这里要注意下,是要调用父视图的layoutIfNeeded。调用子视图有时也可以,但会出现数值偏差的情况。
自己的结论:layoutIfNeeded可以让视图的约束立刻生效。由于模拟器的性能较低,约束还未生效就显示了视图才导致现象的产生。而真机性能较高,能较快的使约束生效。(纯属推测的,哈哈...)
搬来的结论:
1、如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局。
2、在视图第一次显示之前,标记肯定是“需要刷新”的,所以直接调用[view layoutIfNeeded]就会进行立即更新。