美文网首页移动端开发
Autolayout的生命周期

Autolayout的生命周期

作者: 我才是臭吉吉 | 来源:发表于2019-03-19 16:31 被阅读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

    相关文章

      网友评论

        本文标题:Autolayout的生命周期

        本文链接:https://www.haomeiwen.com/subject/tizgmqtx.html