使用Masonry无法获取frame值的问题

在使用Masonry布局,获取控件的frame值的时候,获取的frame都是frame = (0 0; 0 0);

查阅资料发现解决问题的方法,以此记录:

代码:

__eWeak(weak);

UILabel *label = [UILabel labelWithTitle:@"1231231" color:[UIColor redColor] fontSize:14.f alignment:NSTextAlignmentLeft];

[self.view addSubview:label];

[label mas_makeConstraints:^(MASConstraintMaker *make) {

make.top.equalTo(weak.view.mas_top).offset(100);

make.left.equalTo(weak.view.mas_left).offset(30);

make.right.equalTo(weak.view.mas_right).offset(-30);

make.height.mas_equalTo(20);

}];

NSLog(@"%@",label);

打印结果:

UILabel: 0x7fe98df5e150; frame = (0 0; 0 0); text = '1231231'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x608000289c90>

解决办法一:

修改代码:

__eWeak(weak);

UILabel *label = [UILabel labelWithTitle:@"1231231" color:[UIColor redColor] fontSize:14.f alignment:NSTextAlignmentLeft];

[self.view addSubview:label];

[label mas_makeConstraints:^(MASConstraintMaker *make) {

make.top.equalTo(weak.view.mas_top).offset(100);

make.left.equalTo(weak.view.mas_left).offset(30);

make.right.equalTo(weak.view.mas_right).offset(-30);

make.height.mas_equalTo(20);

}];

[self.view layoutIfNeeded];

NSLog(@"%@",label);

打印结果:

UILabel: 0x7ff6f5b394e0; frame = (30 100; 354 20); text = '1231231'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x60400009df60>

解决办法二:

修改代码:

__eWeak(weak);

UILabel *label = [UILabel labelWithTitle:@"1231231" color:[UIColor redColor] fontSize:14.f alignment:NSTextAlignmentLeft];

[self.view addSubview:label];

[label mas_makeConstraints:^(MASConstraintMaker *make) {

make.top.equalTo(weak.view.mas_top).offset(100);

make.left.equalTo(weak.view.mas_left).offset(30);

make.right.equalTo(weak.view.mas_right).offset(-30);

make.height.mas_equalTo(20);

}];

//延迟1秒获取

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

NSLog(@"%@",label);

});

打印结果:

UILabel: 0x7fec99a44c00; frame = (30 100; 354 20); text = '1231231'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x604000292bb0>


总结:

Autolayout最终也是转成frame,masonry是建立在autolayout之上的。Autolayout是在block中实现的,并不是即时转成frame值的,所以在获取的时候需要延迟一秒或者调用官方layoutIfNeeded方法。 延迟1秒不用说,layoutIfNeeded是立即布局的(官方提供的方法,可以去看官方api说明)。

参考:Cocoa开发者社区-无夜之星辰 ,非常感谢。mp.weixin.qq.com/s/QKEJEblH1RN9jGtVDi_d9A

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

推荐阅读更多精彩内容

  • (一)Masonry介绍 Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布...
    木易林1阅读 2,443评论 0 3
  • Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性...
    3dcc6cf93bb5阅读 1,884评论 0 1
  • iOS_autoLayout_Masonry 概述 Masonry是一个轻量级的布局框架与更好的包装AutoLay...
    指尖的跳动阅读 1,250评论 1 4
  • 很久不写女性励志的文章了,但是今晚看了微信好友转发的一篇文章《何三畏:为什么女孩子漂亮也要读书》,还是想说两句。 ...
    冬惊阅读 1,343评论 26 34
  • 云在等它的天空 风在等它的路口 而我们的记忆 一直在等 曾经纯净的相逢 可是 我只想说 三十年太久太久 只争朝夕 ...
    巴山夜遇阅读 260评论 0 0