美文网首页iOS工程实践iOS知识点iOS
WWDC2018观看笔记一:Auto Layout 底层原理

WWDC2018观看笔记一:Auto Layout 底层原理

作者: 小五92 | 来源:发表于2018-09-07 11:39 被阅读59次

    最近看WWDC2018中的Hight Performance Auto Layout,Ken Ferry分析自动布局常见的问题和如何高效使用Auto Layout ,感觉好多干货。

    在iOS12中对自动布局进行了很大的优化,如图1.1,是官方测试后得到的 iOS 12 和 iOS 11 在特定场景下时间开销的对比图。可以明显的看到 iOS 12 具有很大的优势。

    图1.1 iOS11和iOS12下Auto Layout性能对比图

    针对 app客户端代码中常见的问题的探讨 以及 如何正确的使用Auto Layout ,Ken Ferry  主要从以下两个方面进行介绍:

    1).直觉感受和内部实现

    这段代码存在的问题如注释所说:不要这样做,每秒可能发生120次约束添加和移除的操作。为什么 ?

    The Render Loop   

    Render Loop过程确保所有的 UI 视图在每秒的所有帧中都表现出对应表现,正常情况下每秒会运行 120次。这个过程分成三步:

            1.更新约束:从子视图向外层逐级更新约束;

            2.Layout 调整:从外部向内,逐级视图获得自身的 Layout;

            3.渲染与展示:与 Layout 相同,呈现顺序从外向内,使得视图呈现出来;

    具体的过程图,如图1.2所示

    图1.2 The Render Loop 执行过程图

    三个过程对应的方法api ,如图1.3所示:

    图1.3 The Render Loop 三个步骤对应的API

    所以每次约束调整都会执行一次这样的render loop 过程,上述代码中,每次updateConstraints时都会重新移除和增加一次约束,使得性能很差。修改:

    Render loop 的过程是:约束-布局-渲染,那么添加个约束时,内部底层是如何实现的呢?

    首先、当为View增加Constraint时,这些约束会组成一个多元一次方程组,View所在的Window会调用Auto Layout 引擎计算得到解集equation,其中,求出的解集会应用到 UIView渲染过程中,当做其 frame属性中的值来使用。具体过程如图 1.4 所示:

    图1.4 添加一个约束的内部实现流程图

    其次、当计算完成后,auto Layout 引擎会发送通知,使得对应的UIView调用其父视图的setNeedsLayout()方法,进入layout阶段。从而可理解为什么layout是从外到内的。

    因此,每次约束的删除或重新添加,都会重新走一遍引擎计算、由内向外的setNeedsLayout、由外向内的layout。

    2).高效布局的建立

    约束搅动(Churning the Constraints):没有任何变化的约束设置。

             1.使用 Instrument 来捕捉约束搅动:在使用 Auto Layout 布局来实现UITableView,经常会发现滑动卡顿的问题。这些问题在开发的时候很难查出原因所在。为了方便的解决并排查问题,新版的 Xcode 增加了一个新的工具 -Instrument for Layout

            2.Override intrinsicContentSize 来调整UILabel约束性能

            3.不要过度使用systemLayoutSizeFitting():这个方法调用,其目的是从计算引擎中重新获得调用方法对应视图的 Size。过程为:创建引擎 - 增加约束 - layout - 增加size属性 - 销毁引擎。

    相关文章

      网友评论

        本文标题:WWDC2018观看笔记一:Auto Layout 底层原理

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