在使用Masonry的时候,默认情况下,设置的约束并不会立即生效,此时获得的所有的frame都为0。但在有的时候,我们需要获取此时的宽跟高,此时就要设置控件的约束立即生效。
view1 = [UIView new];
[self.view addSubview:view1];
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
view1.backgroundColor = [UIColor redColor];
NSLog(@"%@",view1.description);
得到的结果显示frame为0:
<UIView: 0x7f9d20d0b650; frame = (0 0; 0 0); layer = <CALayer: 0x608000227900>>
所以需要在mas_makeConstraints之后用它的父视图调用layoutIfNeeded可以使得约束立即生效:
view1 = [UIView new];
[self.view addSubview:view1];
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(10, 10, 10, 10));
}];
view1.backgroundColor = [UIColor redColor];
[self.view layoutIfNeeded];
NSLog(@"%@",view1.description);
得到的结果显示:
<UIView: 0x7fa8d8d05730; frame = (10 10; 394 716); layer = <CALayer: 0x60800003ca20>>
提示:layoutIfNeeded在自身也可以生效,不过可能会导致坐标不准确等后果,而用在父视图上不会发生问题。
关于约束更新:
约束更新内容简要写一些,不写详细代码了。
约束更新的内容需要写入mas_updateConstraints中,如果需要立即更新的话需要两个步骤1、updateConstraintsIfNeeded 2、layoutIfNeeded
如果需要产生动画效果的话,将layoutIfNeeded这个方法在[UIView animateWithDuration]中调用即可。
两个方法都是在父视图中使用的。