屏幕适配 size class

来源:互联网 发布:怎样提升淘宝店铺等级 编辑:程序博客网 时间:2024/05/21 06:44

1. 三种尺寸类型(size class)

如果把屏幕的长和宽都按长度划分三种类型(官网中成为size class):压缩(compact)、任意(any)、常规(regular),那么长和宽的组合就有9种类型。这里我把每一种类型称为一种模式。

另外,屏幕的状态根据尺寸大小和其方向可以分为很多情况。模式和屏幕的状态有着对应关系,可以是一对一,也可以是一对多。比如说,一种模式叫任意模式,也就是长是任意的,宽也是任意的,这种模式可以对应所有的屏幕状态。

可以为同一界面定义其在不同模式下的布局。当app运行时会检测设备的屏幕状态(屏幕尺寸以及屏幕方向),以此来决定使用哪种模式下的布局。
在“任意模式”下添加的控件和约束是在所有模式下都生效的。
在某一模式下添加的控件和约束,是该模式私有的。
最高效率的做法是使任意模式下的布局,适配所有屏幕状态。但是有时候,由于展示的内容的限制,不同尺寸、或者横、竖屏的布局会有比较大的区别,有时甚至会增减控件。此时就要分开不同模式来布局用户界面。

2. 模式的切换

模式的切换是通过下图中的size class工具来实现的。框选不同数目的格子对应不同的模式,在工具下方的文字表明了该模式适用于什么屏幕状态(屏幕尺寸、横屏还是竖屏)。注意,格子的数目是有含义的,水平方向上格子数目表示宽的尺寸类型,垂直方向上的格子数目表示高的尺寸类型。三个尺寸类型compact、any、regular对应的格子数分别是1个、2个、3个。

这里写图片描述

选择了某一模式以后,所有布局相关操作就对应于该模式了。为了布局的时候看得舒服,可以将模拟器的尺寸和方向变一下,通过下图两个选项来改变。注意模拟器的尺寸和方向和当前的布局模式是没有关系的。

这里写图片描述

上面说到的屏幕状态与宽、高的尺寸类型的对应关系,这里有表格可以参考(来自苹果官网):

这里写图片描述

3. 不同模式下视图的显示

上面说到,需要分开不同模式来布局的一种情况是,横竖屏的区别很大,甚至会增减视图。此时,视图可能在某种模式下需要显示,在某种模式下不显示。设置视图是否在某种情况下显示的方法如下图(需要先点击一下要设置的视图)。勾选Installed就表明在“任意模式”显示该视图,或者点击“+”号,选择一种模式,再通过是否勾选Installed决定视图在该模式下是否显示。

这里写图片描述

4. 不同模式下图片的显示

为了适应不同的模式,同一张图片可能需要多个尺寸的版本。这种情况下,适应Assets.xcassets来管理这些图片。新建一个Image Set。在这个Image Set中右侧,可以选择需要支持的设备:
这里写图片描述
还可以通过选择Width和Height,组合出不同的模式,然后按实际情况来给某些模式提供对应的图片版本。将对应的图片,填入对应的模式中。下图展示了包含了若干模式的一个Image Set,图中指明了其中的标识的含义:

这里写图片描述

5. 用户触发屏幕状态的变化

上面多次提到屏幕状态,包括屏幕尺寸、屏幕方向。这些信息封装成了一个类——UITraitCollection。
用户改变屏幕状态以后(横屏、竖屏等动作),发生以下动作:
(1)当屏幕状态变化快要改变的时候UIKit会调用这个方法来通知各个相关的视图控制器
willTransitionToTraitCollection:withTransitionCoordinator:
(2)当视图控制器的尺寸快要变化的时候,UIKit会调用
viewWillTransitionToSize:withTransitionCoordinator:
(3)当屏幕状态发生变化以后,UIKit会调用
traitCollectionDidChange:

父控制器可以固定其子视图控制器的模式,让它不受屏幕状态的变化影响。有两个方法可以实现(iOS 8.0 and later):

-(void)setOverrideTraitCollection:(UITraitCollection *)collection
            forChildViewController:(UIViewController *)childViewController`
-(UITraitCollection *)overrideTraitCollectionForChildViewController:(UIViewController *)childViewController
0 0
原创粉丝点击