自适应界面是充分利用可用空间的界面。 自适应意味着能够调整您的内容,使其适合任何iOS设备。 iOS中的自适应模型支持简单但动态的方式来重新排列和调整内容以响应更改。 当您利用此模型时,单个应用程序可以适应显着不同的屏幕大小(如图12-1所示),只需很少的额外代码。
图12-1适应不同的设备和方向
用于构建自适应界面的重要工具是Auto Layout。 使用“自动布局”,可以定义用于控制视图控制器视图布局的规则(称为约束)。 您可以在Interface Builder中以可视方式创建这些规则,或在代码中以编程方式创建这些规则。 当父视图的大小更改时,iOS会根据您指定的约束自动调整其大小并重新定位其余视图。
特征是自适应模型的另一个重要组成部分。 特征描述了视图控制器和视图必须操作的环境。 特征帮助您做出关于您的界面的高级决策。
特征的作用
当只有约束不足以管理布局时,您的视图控制器有几个机会进行更改。 视图控制器,视图和一些其他对象管理指定与该对象关联的当前环境的特征集合。 表12-1介绍了这些特性以及如何使用这些特性来影响用户界面。
表12-1特征
特征 | 实例 | 描述 |
---|---|---|
horizontalSizeClass | UIUserInterfaceSizeClassCompact | 这个特征传达你的界面的一般宽度。 使用它来进行粗略级布局决定,例如视图是垂直堆叠,并排显示,完全隐藏还是以其他方式显示。 |
verticalSizeClass | UIUserInterfaceSizeClassRegular | 这个特征传达你的界面的一般高度。 如果您的设计需要您的所有内容适合在屏幕上,而不滚动,使用这个特质来做布局决定。 |
displayScale | 2.0 | 该特征传达内容是否显示在视网膜显示器或标准分辨率显示器上。 使用它(根据需要)进行像素级布局决定或选择要显示的图像的版本。 |
userInterfaceIdiom | UIUserInterfaceIdiomPhone | 提供此特性是为了向后兼容,并传达您的应用程序运行的设备类型。 避免使用这个特性尽可能多。 对于布局决定,请改用水平和垂直大小类。 |
使用特制来决定如何呈现您的用户界面。 在Interface Builder中构建界面时,使用特征更改您显示的视图和图像,或使用它们应用不同的约束集。 许多UIKit类,如UIImageAsset,使用您指定的特征来定制他们提供的信息。
以下是一些提示,可帮助您了解何时使用不同类型的性状:
- 使用大小类对界面进行粗略更改。 大小类更改是添加或删除视图,添加或删除子视图控制器或更改布局限制的适当时间。 您也可以不做任何事情,让您的界面自动适应其现有的布局约束。
- 不要假设大小类对应于视图的特定宽度或高度。 您的视图控制器的大小类可以改变很多原因。 例如,iPhone上的容器视图控制器可能使其中一个子项水平正则,以强制其显示其内容不同。
- 使用Interface Builder根据需要为每个大小类指定不同的布局约束。 使用Interface Builder指定约束要比添加和删除约束简单得多。 View控制器通过从它们的storyboard应用适当的约束来自动处理大小类的变化。
- 避免使用惯用语言来决定您的界面的布局或内容。 在iPad和iPhone上运行的应用程序通常应显示相同的信息,并应使用大小类来进行布局决策。
当特征和尺寸变化发生?
特征变化很少发生,但它们确实发生。 UIKit基于对底层环境的更改来更新视图控制器的特征。 尺寸类特征比显示尺度特征更有可能改变。 惯用语言特性应该很少,如果有的话,改变。 发生尺寸类更改的原因如下:
- 视图控制器窗口的垂直或水平大小类别已更改,通常是因为设备旋转。
- 容器视图控制器的水平或垂直大小类已更改。
- 当前视图控制器的水平或垂直尺寸类通过其容器显式更改。
视图控制器层次中的大小类更改传播到任何子视图控制器。 窗口对象用作该层次结构的根,为其根视图控制器提供基线大小类特征。 当设备方向在纵向和横向之间变化时,窗口更新其自己的大小类信息,并将该信息传播到视图控制器层次结构中。 容器视图控制器可以将修改传递给未修改的子视图控制器,或者它们可以覆盖每个子对象的特性。
在iOS 8及更高版本中,当设备在横向和纵向方向之间旋转时,窗口始终位于左上角,窗口的边界将更改。 窗口大小更改与视图控制器层次结构以及任何对应的特性更改一起传播。 对于层次结构中的每个视图控制器,UIKit调用以下方法来报告这些更改:
- willTransitionToTraitCollection:withTransitionCoordinator:告诉每个相关的视图控制器它的traits即将改变。
- viewWillTransitionToSize:withTransitionCoordinator:告诉每个相关的视图控制器它的大小将要改变。
- traitCollectionDidChange:告诉每个相关的视图控制器它的traits现在已经改变。
当移动视图控制器层次结构时,UIKit仅在有报告更改时才将更改报告给视图控制器。 如果容器视图控制器覆盖其子项的大小类,那么当容器的大小类更改时不会通知这些子项。 类似地,如果视图控制器的视图具有固定的宽度和高度,则它不会接收大小更改通知。
图12-2显示了当iPhone 6上发生旋转时,视图控制器的特征和视图大小如何更新。从纵向到横向的旋转将屏幕的垂直大小类从常规更改为紧凑。 大小类别改变和对应的视图大小改变然后沿着视图控制器层级传播。 在将视图动画化为其新大小后,UIKit在调用视图控制器的traitCollectionDidChange:方法之前应用大小类和视图大小更改。
图12-2更新视图控制器的特性和视图大小
不同设备的默认大小类别
每个iOS设备都有一组默认的大小类,您可以在设计界面时将其用作指南。 表12-2列出了纵向和横向设备的大小类别。 表中未列出的设备与具有相同屏幕尺寸的设备具有相同的大小类别。
表12-2不同屏幕尺寸的设备的尺寸类别。
重要
不要假设您的应用程式会在装置上显示特定大小类别。 在决定如何配置对象时,始终
检查对象的特征集合中找到的大小类。