Auto Layout的来历
- 1997年,Auto Layout用到的布局算法 Cassowary被发明了出来;
- 2011年,苹果公司将Cassowary算法运用到了自家的布局引擎Auto Layout中;
Auto Layout的生命周期
Auto Layout有一整套布局引擎系统叫Layout Engine,用来统一管理布局的创建、更新和销毁。每个视图在得到自己的布局之前,Layout Engine会将视图、约束、优先级、固定大小通过计算转换成最终的大小和位置。当发生Constraints Change时,Layout Engine会重新计算布局,获取到布局后调用superview.setNeedLayout(),然后进入Deffered Layout Pass。Deffered Layout Pass主要作用是做容错处理,假如有些视图在更新约束时没有确定或缺失布局声明的话,会先在这里做容错处理。然后Layout Engine会从上到下调用layoutSubviews(),通过Cassowary算法计算子视图的位置,算出来后将子视图的frame从Layout Engine里拷贝出来,之后的流程就和手写布局一样完成绘制、渲染。
1.Constraints Change包括添加、删除、更新、Activating、Deactivating、改变约束优先级。
2.总体流程就是Constraints Change ->Layout Engine重新计算布局->触发superview.setNeedLayout()->Deffered Layout Pass容错处理->触发layoutSubviews()->绘制、渲染
Auto Layout性能问题
iOS12之前,视图嵌套的数量对性能的影响是呈指数级增长的,而iOS12优化之后对性能的影响是线性增长,对性能消耗不大。
戴铭老师的DSL布局:https://github.com/ming1016/STMAssembleView,类似VFL按照UIStackView的思路用Auto Layout实现。