移动端开发

Autolayout的生命周期

2019-03-19  本文已影响0人  我才是臭吉吉
Autolayout生命周期.jpg

上图即为Autolayout的生命周期过程(截取自219_mysteries_of_auto_layout_part_2)。

生命周期

  1. APP启动后,随着RunLoop的运行,系统在其内部监听着约束变化(Constraints Change):如激活或失效约束、修改优先级、修改常量值等任意造成约束方程式修改的操作,甚至是直接添加或删除视图等操作,都可以导致约束发生变化。
  2. 在接收到布局变化后,Layout Engine会根据变化的约束重新计算布局,并将需要更新布局的视图进行标记(对其父视图调用setNeedsLayout方法),之后便进入延迟布局阶段(Deffered Layout Pass)。

    注意:

    在进入延迟布局阶段之前,Layout Engine已经将更新的约束计算完毕并将视图的新frame求出。但并不在此时更新视图。

  3. 延迟布局阶段:此阶段的主要作用是将错误位置的视图重新定位(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
上一篇下一篇

猜你喜欢

热点阅读