1 布局在iOS中的发展纯代码计算frame
从开始到现在。Autoresizing
2011年IOS5,Autoresizing。
早期的UI布局技术,仅适用于约束父子控件之间的布局关系。早期IOS设备单一、界面布局简单,屏幕适配远没有现在这么复杂,Autoresizing可以满足布局需要。Auto Layout
2012年IOS6,Auto Layout。
比Autoresizing更高级,旨在替代Autoresizing,可以设置任何控件之间的布局关系。NSLayoutAnchor
2015年IOS9,NSLayoutAnchor,基于Auto Layout。A factory class for creating layout constraint objects using a fluent API.
Use these constraints to programatically define your layout using Auto Layout.
NSLayoutAnchor提供了便利的API来创建约束,NSLayoutAnchor不是新的布局方式,而是用于创建Auto Layout约束的工具。UILayoutGuide
2015年IOS9,UILayoutGuide,基于Auto Layout。A rectangular area that can interact with Auto Layout.
Use layout guides to replace the dummy views you may have created to represent inter-view spaces or encapsulation in your user interface.
UILayoutGuide是帮助开发者使用Auto Layout布局时的一个虚拟占位视图,用于定义一个可以参与自动布局的矩形区域,替代占位视图实现元素之间的等间距效果或封装界面模块其功能依赖NSLayoutAnchor实现。UIStackView
2015年IOS9,UIStackView,基于Auto Layout。A streamlined interface for laying out a collection of views in either a column or a row.
UIStackView是一个专门用于布局的UI控件,用于布置成行或成列的视图集合。
2 Autoresizing
Autoresizing是Apple在2011年IOS5中推出的布局技术,用于设置父子视图之间的布局关系。Autoresizing只能设置子视图和父视图之间的位置、大小关系,不能设置兄弟视图之间的布局关系,更不能设置完全不相关的两个视图之间的布局关系。
设置Autoresizing有两种方式:代码方式和xcode Interface Builder方式。两种方式可以比较直观地看出是一一对应的。
在Interface Builder中,设置Autoresizing由两个正方形(父view PV,子view CV),PV与CV之间的四条虚线(左L、右R、上T、下B)控制子view相对于父view的相对位置,CV内两条带箭头的虚线(宽W、高H)控制子view的大小。当我们点击虚线时,它会变成实线。AutoresizingMask作用IB
UIViewAutoresizingNone无都为虚线
UIViewAutoresizingFlexibleLeftMargin自动调整CV与PV的左边距,保持右边距不变L为虚线
UIViewAutoresizingFlexibleRightMargin自动调整CV与PV的右边距,保持左边距不变R为虚线
UIViewAutoresizingFlexibleTopMargin自动调整CV与PV的上边距,保持下边距不变T为虚线
UIViewAutoresizingFlexibleBottomMargin自动调整CV与PV的下边距,保持上边距不变B为虚线
UIViewAutoresizingFlexibleWidth自动调用CV宽度,保持左右边距不变W为实线
UIViewAutoresizingFlexibleHeight自动调用CV高度,保持上下边距不变H为实线
3 AutoLayout
AutoLayout旨在替代Autoresizing。
4 AutoLayout、autoresizingMask与translatesAutoresizingMaskIntoConstraints没有设置AutoLayout:无论translatesAutoresizingMaskIntoConstraits是否为YES,autoresizingMask都会生效。
设置AutoLayou:,translatesAutoresizingMaskIntoConstraits为YES,autoresizingMask生效;translatesAutoresizingMaskIntoConstraits为NO,AutoLayout生效。
5 AutoLayout性能问题
Apple早在iOS6时就引入了AutoLayout,但是直到现在还有很多开发者迟迟不愿意使用它,其原因就是对其性能的担忧。另外,Apple在WWDC2018中介绍说:iOS12将大幅提高AutoLayout的性能,使滑动达到满帧。
iOS12与iOS11 AutoLayout性能对比:
iOS12之前,很多约束变化时都会重新创建一个计算引擎NSISEnginer,将约束关系重新加进来,然后重新计算。结果就是,涉及到的约束关系变多时,新的计算引擎需要重新计算最终导致计算量呈指数级增加。
iOS12的AutoLayout更多地利用了Cassowary算法的界面更新策略,使其真正完成了高效的界面线性策略计算。
参考
Auto Layout是怎么进行自动布局的,性能如何?