ViewController Programming Guide 笔记(八)

The Adaptive Model

自适应的接口可以有效地利用空间,使其自适应意味着你可以调整你的内容很好地适应 iOS 设备。在 iOS 中的自适应模型支持简单而动态的方式来重新排列、调整内容的大小,以响应更改内容。当你利用这种模式时,一个单一的应用程序可以适应不同的屏幕大小

构建自适应的界面最重要的工具是 Auto Layout,而 Traits 是自适应模式的另一个重要组成部分,Traits 描述了在某些环境下视图控制器和视图必须要做的操作,可以帮助你在更高层面上来描述界面。

The Role of Traits

当约束单并不足以管理布局时,您的视图控制器有几次机会进行更改。视图控制器、视图和几个其他对象管理着一个 traits 集合,这些 traits 对应着当前这些对象的环境特征。表 12-1 描述了 traits 以及如何使用它们来影响你的用户界面

|

Trait|
Examples|
Description | |-------------|----------------|---------------------| |
horizontalSizeClass|
UIUserInterfaceSizeClassCompact|
水平特性| |
verticalSizeClass|
UIUserInterfaceSizeClassRegular|
垂直特性| |
displayScale|
2.0 |
表示内容是否显示在视网膜屏幕上| |
userInterfaceIdiom|
UIUserInterfaceIdiomPhone|
判断设备类型,仅作兼容性检查。不要用这个来做 layout 的检查,用之前的 horizontal 和 vertical size classes|

使用 traits 来做决定如何呈现您的用户界面,当你用 IB 构建时,使用 traits 来定制需要显示的 view 或相关的 约束

下面是一些帮助你理解什么时候使用这些类型 traits 的小贴士:

  • Use size classes to make coarse changes to your interface。Size class 可以适当的时间增加移除 views,childVC,或更改 layout 约束。你也可以什么都不做,让界面根据现有的 layout 约束自适应。
  • Never assume that a size class corresponds to the specific width or height of a view.
  • Use Interface Builder to specify different layout constraints for each size class, as appropriate
  • Avoid using idiom information to make decisions about the layout or content of your interface.

When Do Trait and Size Changes Happen?

Size class 会在如下情形发生改变:

  • 设备旋转时,VC windows 对应垂直和水平的 size class 发生变化
  • 容器类 VC 的水平和垂直 size class 发生变化
  • 子 VC 的 horizontal 或 vertical size class 因为容器类父 VC 发生变化而产生变化

VC 层级上的 Size class 发生变化会沿继承树向下传导到子 VC,window 对象作为层级的根,为 root VC 提供最基本的 size class traits,当设备旋转时,window 会更新自身的 size class 信息,然后向下传递(VC 的层级)

对于层次结构中每个视图控制器,UIKit 调用以下方法来报告这些更改:

  • willTransitionToTraitCollection:withTransitionCoordinator: 告知每一个相关的 VC ,traits 将要发生改变
  • viewWillTransitionToSize:withTransitionCoordinator: 告知每一个相关的 VC,Size 将要发生变化
  • traitCollectionDidChange: 告知相关 VC 已经变化完毕

只有发生变化时,UIKit 才会报告,如果容器 VC 重载了子 VC 的 size classes,那么这些子 VC 就不会收到关于父 VC 发生改变时的通知。类似的,如果一个 VC 的 view 是固定宽和高,那么也不会收到 size 改变通知。

下图展示了 VC 的 traits 和 view size 随设备旋转发生的改变

Default Size Classes for Different Devices

每个 iOS 设备都有默认的 size classes,下面展示了垂直和水平方向的 size class

|

Device|
Portrait|
Landscape| |--------------|----------------|------------------| |iPad (all)
iPad Mini|Vertical size class: Regular
Horizontal size class: Regular|Vertical size class: Regular
Horizontal size class: Regular| |iPhone 6 Plus|Vertical size class: Regular
Horizontal size class: Compact|Vertical size class: Compact
Horizontal size class: Regular| |iPhone 6|Vertical size class: Regular
Horizontal size class: Compact|Vertical size class: Compact
Horizontal size class: Compact| |iPhone 5s
iPhone 5c
iPhone 5|Vertical size class: Regular
Horizontal size class: Compact|Vertical size class: Compact
Horizontal size class: Compact| |iPhone 4s|Vertical size class: Regular
Horizontal size class: Compact|Vertical size class: Compact
Horizontal size class: Compact|

永远不要假设你的 app 将会显示在特定的 size class 设备上,总是检查对象的 trait 属性,根据其中的 size class 对下一步配置做出决定。


-EOF-

如果感觉此文对你有帮助,请随意打赏支持作者 😘

chengway

认清生活真相之后依然热爱它!

Subscribe to Talk is cheap, Show me the world!

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!