解决Masonry自动布局frame为0的问题

*  先上一段运用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的布局是显示正常的,这是两回事。

你可能感兴趣的:(解决Masonry自动布局frame为0的问题)