iOS iOS12 Auto Layout 的春天

2019-03-19  本文已影响0人  吃土豆的Panda



1.Auto Layout  的布局算法 Cassowary

  介绍Auto Laout 之前我们先聊一个技术->Cassowary,  Cassowary 是一种专门用来计算布局的算法,Cassowary能够有效的解析线性等式系统和线性不等式系统,用来表示用户界面中那些相等关系和不等关系.基于此,Cassowary开发了一种规则系统,通过约束来描述视图间的关系.约束就是规则,这个规则能够表示出一个视图相对于另一个视图的位置.

由于Cassowary算法让视图位置可以按照一种简单的布局思路来写,这些简单的相对位置描述可以在运行时动态的计算出视图具体位置.视图位置的写法简化了,界面相关代码也就更容易维护.

看到这里你大概就能猜到Apple也许就是用类似Cassowary这种算法来计算Auto Laout 的布局的,猜对啦,2011年Apple将此算法正式运用到了自家的Auto Laout 中.我们了解了这些之后再看一下Auto Layout生命周期,去进一步分析

2.Auto Layout 生命周期

    作为优秀的Apple自家布局系统当然不仅仅只有Cassowary布局算法,它还包含了在运行时的生命周期等一整套布局引擎系统,用来统一管理布局的创建,更新和销毁.了解Auto Laout的生命周期,是理解它的性能相关话题的基础.这样在遇到问题时,我们才能从根上找到原因!

    这一套布局引擎系统叫做Layout Engine,是Auto Laout核心,主导着整个布局.

每个视图在得到自己的布局之前,Layout Engine 会讲视图,约束,优先级,固定大小,通过计算换成最终的大小和位置.在Layout Engine里面每当约束发生变化时,就会触发Deffered Layout Pass,完成后进入监听约束变化的状态.当再次监听到约束变化,即进入下一轮循环中.整个过程如下图:

Constranints change 表示的就是约束变化,添加,删除视图时会触发约束变化.Activating或Deactivationg,设置Constant或者Priority时也会触发约束变化.Layout Engine 在碰到约束变化后会重新计算布局,获取到布局后调用superview.setNeedLaout(),然后进入 Deffered Layout Pass.

Deffered Layout Pass 的主要作用是做容错处理.如果有些视图在更新约束时没有确定或缺失布局的话,会先在这个方法做容错处理.

接下来,Layout Engine 会从上到下调用layoutSubviews(),通过Cassowary算法计算各个子试图的位置,算出来后将子视图的frame从Layout Engine里拷贝出来.

在这之后的处理,就和手写的布局绘制,渲染过程一样了,所以,使用Auto Layout和手写的区别,就是多了布局上的这个计算过程.那么,多的这个Cassowary布局,就是影响Auto Layout性能的原因吗?

接下来,我们来分析一下Auto Layout的性能问题



Auto Layout 的性能是否有问题,我们先看看苹果公司自己是怎么说的吧.

    上图是WWDC2018 讲的Auto Layout在iOS 12 之前和之后的表现!  可以很明显的看到,优化后的性能,已经基本和手写布局一样可以达到性能随着视图嵌套的数量成线性增长了.而在此之前的Auto Layout,视图嵌套的数量对性能的影响是成指数级别增长的.

所以在iOS12之前Auto Layout对性能影响还是很大的! 但是这个锅能让Cassowary算法来背吗?我们再来看下一张图

    可以看到,兄弟视图之间没有关系时,是不会出现性能呈支数增加的问题的.这就表示Cassowary算法在添加时是高效的,但如果兄弟视图间有关系的话,在视图遍历时会不断处理和兄弟视图之间的关系,这时会有更新计算.

    由次可以看出,Auto Layout并没有用上Cassowary高效修改更新的特性.

    实际情况下iOS12之前,很多约束变化时都会重新创建一个计算引擎NSISEnginer将约束关系重新加进来,然后重新计算.结果就是,涉及到的约束关系变多时,新的计算引擎需要重新计算,最终导致计算量呈指数级增长.

    iOS12的Auto Layout更多的利用了Cassowary算法的界面更新策略,使其真正完成了高效的界面线性策略计算.

那么,明确了iOS12是的Auto Layout具有了和手写布局几乎相同的高性能后,你是不是就可以放心使用Auto Layout了呢?

答案是,必须的! iOS12 使用Auto Layout 可以极大的提升我们的开发效率,各位小伙伴可以放心使用啦!

上一篇下一篇

猜你喜欢

热点阅读