深入理解代替单纯记忆
代码与截图基于
Xcode 10.1 + Swift 4.2
概念
- iOS 8引入了Size Class概念
- 是因为iOS设备(包括iPod、iPhone、iPad等)尺寸太多,之前开发者为了适配需要了解每个设备的宽、高
- 而Size Class是想为所有尺寸的iOS设备抽象出一个统一的尺寸描述规则

- 图中列出了当时(2017年)所有iPhone和iPad的尺寸(半透明的矩形代表不同设备),并且提供了portrait和landscape两个方向
- 两条白线列出了四个象限,分别对应着
compact和regular的尺寸 - 白线的位置距离左上角是否固定?目前来看iPhone Xs landscape下的宽度应该是
wC和的wR的界限;同样iPhone Xs landscape下的高度应该是hC和hR的界限。随着新设备出来,我想白线是会变的 - 任何一个设备,左上角对齐放入这个坐标系下,宽或高所在的象限就是它的Size Class值
- 例如,iPhone Xs Max的landscape情况下,是compact height + regular width
Interface Builder中的使用
默认状态下,设置的属性适用于所有的Size Class值
开启/关闭Size Class的位置

套路一
-
选择
vary for trait,选择height或width,也可都选。解释下弹出的height和width两个选项- 由前面
device+orientation可以确定一个Size Class值了,比如wC * hR。如果选择了height,则表示后面我们要添加的一些属性比如autolayout,将针对所有符合hR状态(即宽度上比较窄时,例如iPhone 垂直状态、iPad垂直和landscape状态)的设备 - 其实选中
height或width后,Xcode会自动提示有哪些状态符合条件。类似Varying 42 Regular Height Devices
- 由前面
-
选好后,后面针对这种状态自定义自己想要的属性就行了,比如添加autolayout
-
选择
Done Varying
套路二
我们通过Interface Builder给各种UI空间添加属性时,会在属性左边看到+号,这里可以添加各种Size Class下不同的属性值
代码中的使用
- 通过
UITraitCollection对象可以获取到Size Class值 UITraitCollection是UITraitEnvironment协议的属性- 下面这些类实现
UITraitEnvironment协议- UIScreen, UIWindow, UIViewController, UIPresentationController, UIView