* 先上一段运用Masonry自动布局的代码:
- (void)viewDidLoad {
[super viewDidLoad];
_topView = [UIView new];
_topView.backgroundColor = [UIColor redColor];
[self.view addSubview:_topView];
[_topView mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(self.view).offset(50);
make.left.right.mas_equalTo(self.view);
make.height.mas_equalTo(self.view).multipliedBy(0.3);
}];
NSLog(@"%@",NSStringFromCGRect(_topView.frame));
}
这个打印结果如下:
也就是_topView的frame为0,这是什么鬼?如果这时候用_topView的frame去计算或者布局其他的控件,可能就不能达到预期的结果喽。
* 查找原因:原来Masonry布局不会在每次布局之后立即调用相关控件的layoutSubviews方法进行布局,而是会把布局和绘制的时机交给系统,在下一次的绘制循环中进行绘制,从而那个时候frame才不为0。
* 解决方法:为了解决实时绘制的问题,这就需要我们自己手动去调用layoutSubviews方法了。调用的方法可以根据情况是调用layoutIfNeeded或者setNeedsLayout,还是两个方法同时手动调用了。
这里可以添加代码:
[_topView layoutIfNeeded];
或者直接调用父视图的方法:[self.view layoutSubviews];
* 结果:这个时候打印结果frame就不为0了
* PS:这是需要补充的是,_topView的frame为0,会影响马上通过该frame进行计算和布局,但是这里_topView在self.view的布局是显示正常的,这是两回事。