iOS进阶 - AutoLayout 是如何自动布局的,性能如何?
2019-05-28 19:23
736 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qiuxuewei2012/article/details/90645521
iOS进阶 -
设置约束的
iOS进阶 - AutoLayout
是如何自动布局的,性能如何?
AutoLayout是iOS6引入到系统中的,在 WWDC2018 中苹果介绍 iOS 12 将大幅提高
AutoLayout的性能。
AutoLayout
的生命周期
AutoLayout不只有布局算法
Cassoway,还包含了布局在运行时的生命周期等一整套布局引擎系统,用于统一管理布局的创建、更新和销毁。这一整套布局引擎叫做
Layout Engine,是
AutoLayout的核心,主导者整个界面布局。
每个视图在得到自己的布局之前,
Layout Engine会将视图、约束、优先级、固定大小通过计算转换成最终的大小和位置,在
Layout Engine里,每当约束发生变化,就会触发
Deffered Layout Pass, 完成后进入监听约束变化的状态。当再次监听到约束变化,即进入下一轮循环中。
设置约束的
Constant和
Priority时也会触发约束变化。
Layout Engine在碰到约束变化后会重新计算布局,获取到布局后调用
superView.setNeedLayout()然后进入
Deffered Layout Pass,
Deffered Layout Pass的作用主要是容错处理,如果有些视图在更新约束时没有确定或缺失布局声明会在此做容错处理。接下来,
Layout Engine会从上到下调用
layoutSubViews(), 通过
Cassoway算法计算各个子视图的位置,算出来将子视图的 frame 从
Layout Engine拷贝出来。
AutoLayout
的 的性能问题
Auto Layout在 iOS 12 中优化后的性能,已经基本和手写布局一样可以达到性能随着视图嵌套的数量呈线性增长 了。而在此之前的 Auto Layout,视图嵌套的数量对性能的影响是呈指数级增长的。
为什么 iOS 12 以前性能不好呢? 原因是:iOS 12以前,当有约束变化时都会重新创建一个计算引擎
NSISEngier将约束关系重新加起来,重新计算。涉及到约束关系变多时,新的计算引擎需要重新计算,最终导致计算量指数级增加!
Cassoway算法本身没有问题,问题是iOS 12之前在某些情况下没有用好这个算法。
iOS 12 以后的
AutoLayout更多的利用了
Cassoway算法的界面更新策略,使其真正完成了高效的界面线性策略计算,使其和手写布局有了几乎相同的高性能!
极客时间-iOS开发高手课 学习笔记
相关文章推荐
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- iOS 8 Auto Layout界面自动布局系列1-自动布局的基本原理
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- iOS AutoLayout自动布局中级开发教程(6)-淘宝客户端iPhone 6/6 Plus 设计·适配方案
- IOS 自动布局指南1 介绍(auto layout guide)
- iOS 开发之 AutoLayout 自动布局
- iOS AutoLayout自动布局中级开发教程label等文字自动适应大小,宽度
- iOS 8 Auto Layout界面自动布局系列1-自动布局的基本原理
- iOS 8 Auto Layout界面自动布局系列3-使用代码添加布局约束
- iOS AutoLayout自动布局中级开发教程(4)-label等文字自动适应大小,宽度
- iOS 8 Auto Layout界面自动布局系列5-自身内容尺寸约束、修改约束、布局动画
- IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
- iOS AutoLayout 及SizeClass 自动布局(一)
- IOS 6 自动布局 入门-1(IOS中autolayout和之前版本autoresize的差异)
- [转载] iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- iOS 8 自动布局sizeclass和autolayout的使用
- IOS不用AutoLayout也能实现自动布局的类(3)----MyRelativeLayout横空出世
- iOS:Autolayout自动布局实例
- iOS 8 Auto Layout界面自动布局系列2-使用Xcode的Interface Builder添加布局约束
- iOS开发笔记--使用Auto Layout中的VFL(Visual format language)--代码实现自动布局