layoutSubviews
这个方法用来计算子视图的位置和大小,它会调用子视图的layoutSubviews方法
,所以开销很大。
当此方法执行完成后会触发该View所属的ViewController的viewDidLayoutSubviews
,所以应该把所有依赖于布局或者大小的代码放在 viewDidLayoutSubviews 中,而不是放在 viewDidLoad 或者 viewDidAppear 中。
layoutSubviews的开销很大,所有我们不能直接显式地调用它。触发layoutSubviews执行有以下几种方法:
1、自动刷新触发器:
- a、修改View的大小;
- b、增加subView;
- c、UIScrollView滚动;
- d、设备旋转;
- e、更新约束;
2、setNeedsLayout
方法会立刻执行并返回,但在返回前不会真正更新视图。视图会在下一个 update cycle 中更新。
3、layoutIfNeeded
会立即调用 layoutSubviews 方法。但是如果你调用了 layoutIfNeeded 之后,并且没有任何操作向系统表明需要刷新视图,那也不会调用 layoutsubview。
setNeedsLaylout是最省资源的方法,但是当我们通过修改约束来进行动画时,就需要用layoutIfNeeded 来动画到新的状态,以确保在动画开始之前传播所有的布局更新:
[self layoutIfNeeded];
[UIView animateWithDuration:0.25 animations:^{
// 更新约束
[self layoutIfNeeded];
}];
网友评论