在使用Masonry布局,獲取控件的frame值的時(shí)候黍衙,獲取的frame都是frame = (0 0; 0 0);
查閱資料發(fā)現(xiàn)解決問(wèn)題的方法霎箍,以此記錄:
代碼:
__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);
打印結(jié)果:
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);
打印結(jié)果:
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);
});
打印結(jié)果:
UILabel: 0x7fec99a44c00; frame = (30 100; 354 20); text = '1231231'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x604000292bb0>
總結(jié):
Autolayout最終也是轉(zhuǎn)成frame,masonry是建立在autolayout之上的访娶。Autolayout是在block中實(shí)現(xiàn)的矾缓,并不是即時(shí)轉(zhuǎn)成frame值的怀酷,所以在獲取的時(shí)候需要延遲一秒或者調(diào)用官方layoutIfNeeded方法。 延遲1秒不用說(shuō)嗜闻,layoutIfNeeded是立即布局的(官方提供的方法,可以去看官方api說(shuō)明)桅锄。
參考:Cocoa開發(fā)者社區(qū)-無(wú)夜之星辰?琉雳,非常感謝。mp.weixin.qq.com/s/QKEJEblH1RN9jGtVDi_d9A