iOS开发布局方式的演进
- 手动布局方式,开发者自己计算每个视图的frame,开发维护效率很低
- iOS6引入了Autolayout,由于担心性能问题,很多开发者迟迟不敢使用这个新技术方案
- 后来,苹果在Autolayout基础上,模仿前端Floxbox布局,推出了UIStackView,大大提升开发效率和布局灵活性
Autolayout
Auto Layout ,是苹果公司提供的一个基于约束布局,动态计算视图大小和位置的库,并且已经集成到了 Xcode 开发环境里。
Autolaout发展历史
- 1997 年,Auto Layout 用到的布局算法 Cassowary 被发明了出来
- 2011 年,苹果公司将 Cassowary 算法运用到了自家的布局引擎 Auto Layout 中(2012年6月12日发布iOS6)
- 2018 年在 iOS 12 中优化后的性能,已经基本和手写布局一样可以达到性能随着视图嵌套的数量呈线性增长了。而在此之前的 Auto Layout,视图嵌套的数量对性能的影响是呈指数级增长的
Autolaout生命周期
Auto Layout 不只有布局算法 Cassowary,还包含了布局在运行时的生命周期等一整套布局引擎系统,用来统一管理布局的创建、更新和销毁。
这一整套布局引擎系统叫作 Layout Engine ,是 Auto Layout 的核心,主导着整个界面布局。
每个视图在得到自己的布局之前,Layout Engine 会将视图、约束、优先级、固定大小通过计算转换成最终的大小和位置。在 Layout Engine 里,每当约束发生变化,就会触发 Deffered Layout Pass,完成后进入监听约束变化的状态。当再次监听到约束变化,即进入下一轮循环中。整个过程如下图所示:
在这之后的处理,就和手写布局的绘制、渲染过程一样了。
使用 Auto Layout 一定要注意多使用 Compression Resistance Priority 和 Hugging Priority,利用优先级的设置,让布局更加灵活,代码更少,更易于维护。
Auto Layout 的易用性
苹果公司后来又提供了 VFL (Visual Format Language) 这种 DSL(Domain Specific Language,中文可翻译为“领域特定语言”) 语言来简化 Auto Layout 的写法。在前端出现了 Flexbox 这种高级的响应式布局思路后,苹果公司也紧跟其后,基于 Auto Layout 又封装了一个类似 Flexbox 的 UIStackView,用来提高 iOS 开发响应式布局的易用性。
题外话:苹果一个技术支持人员聊到,到底应该使用苹果自己的布局还是第三方工具比如 Texture 时,他的观点是:使用苹果公司的技术得到的技术升级是持续的,而第三方不再维护的可能性是很高的。所以,你会怎么选择呢?