Autolayout的生命周期
2019-03-19 本文已影响0人
我才是臭吉吉
Autolayout生命周期.jpg
上图即为Autolayout的生命周期过程(截取自219_mysteries_of_auto_layout_part_2)。
生命周期
- APP启动后,随着RunLoop的运行,系统在其内部监听着约束变化(Constraints Change):如激活或失效约束、修改优先级、修改常量值等任意造成约束方程式修改的操作,甚至是直接添加或删除视图等操作,都可以导致约束发生变化。
- 在接收到布局变化后,Layout Engine会根据变化的约束重新计算布局,并将需要更新布局的视图进行标记(对其父视图调用setNeedsLayout方法),之后便进入延迟布局阶段(Deffered Layout Pass)。
注意:
在进入延迟布局阶段之前,Layout Engine已经将更新的约束计算完毕并将视图的新frame求出。但并不在此时更新视图。
- 延迟布局阶段:此阶段的主要作用是将错误位置的视图重新定位(Reposition misplaced views)。其在视图层级中执行,分为两步:
- 更新约束:从下往上(子视图到父视图),依次遍历视图层级,调用View的updateConstraints方法(或ViewController的updateViewConstraints方法)来更新约束(你可以在此覆盖本方法来设置自定义约束,且在此设置时,执行效率最高。记得最后调用父类实现)。
- 给视图及子视图重新设定位置(给view的frame赋值):从上到下依次调用View的layoutSubViews方法(或ViewController的viewLayoutSubViews方法),从Layout Engine中取出预算好的frame进行赋值(你可以覆盖此方法实现自定义布局,不过此刻不是稳态,需要在适合时候调用父类实现)。
延迟布局阶段的触发条件
调用方法 | 结果 |
---|---|
setNeedsUpdateConstraints | 下一次loop执行updateConstraints |
updateConstraintsIfNeeded | 立即执行updateConstraints |
setNeedsLayout | 下一次loop执行layoutSubViews |
layoutIfNeeded | 立即执行layoutSubViews |
setNeedDisplay | 下一次loop执行draw |