iOS使用Masonry在模拟器里约束不起作用


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]就会进行立即更新。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • 面向对象的三大特性:封装、继承、多态 OC内存管理 _strong 引用计数器来控制对象的生命周期。 _weak...
    运气不够技术凑阅读 1,129评论 0 10
  • 布局 layoutSubviews 不能显示调用这个方法,有许多可以在run loop 的不同时间点触发layou...
    _YZG_阅读 4,527评论 0 2
  • d3.zoom() Creates a new zoom behavior. The returned behav...
    邹小邹大厨阅读 880评论 0 0
  • 青葱岁月,在荷尔蒙的刺激下,少男,少女变的冲动和暴躁。脸上的小痘痘如雨后竹笋般,陆陆续续长满了整张脸庞,这让看重美...
    爱笑的阿斗阅读 140评论 0 0