1

在我的应用程序中,当在小型设备(例如 iPhone 纵向)和大型设备(例如 iPad 全屏)上使用时,大多数视图在 UI 设计上存在重大差异。基本架构保持不变,但每个视图控制器都需要显示一个非常不同的 UI 元素集。

我可以通过根据尺寸等级安装和卸载元素以及自动布局约束来响应 Interface Builder 中的尺寸变化,但这将非常笨拙和脆弱。

在过去(~2014 年),Apple 的建议是:

如果您想根据设备是纵向还是横向显示相同的数据,方法是使用两个单独的视图控制器。一个视图控制器应该管理数据在主要方向(通常是纵向)上的显示,而另一个视图控制器管理数据在备用方向上的显示。

尽管出现了 Size Classes,但我觉得这仍然是我特定设计的最佳解决方案(记住要考虑 size classes 和 split-view、slide-in。)

问题 1:我应该在我的应用程序中的什么时候检测特征变化?

问题 2:(假设我已经从情节提要加载了备用视图控制器)以响应特征更改,我应该如何最好地转换/呈现备用视图控制器?

我在这里问同样的问题:Adaptive swapping of View Controllers in response to Size Class Trait changes iOS 9

因为没有人回答最初的问题。

4

1 回答 1

1

如果您谈论的是运行时期间的特征更改,例如设备旋转和 iPad 多任务处理,您可以在此方法中使用viewWillTransitionToSize(请参阅此问题以获取示例代码)并调整视图层次结构(如果您愿意,可以使用动画)。只需使用普通视图和视图控制器呈现方法来添加/删除呈现的控制器或子控制器及其视图。

如果您在谈论启动时的特征更改(iPad 与 iPhone),只需为这两种设备创建不同的故事板或根视图控制器并将其设置在您的应用程序委托中。但是,这种方法的不利之处在于,如果您没有额外的工作,就无法为横向的大尺寸 iPhone 提供类似 iPad 的体验。


不过,我想挑战你所说的:

我可以通过根据尺寸等级安装和卸载元素以及自动布局约束来响应 Interface Builder 中的尺寸变化,但这将非常笨拙和脆弱。

Xcode 6 及更高版本支持文档描述的“统一故事板”,如下所示:

故事板可以根据显示视图控制器的尺寸类添加或删除视图和布局约束。您可以为多个尺寸类制作一个故事板,而不是维护两个单独的(但相似的)故事板。首先,使用通用界面设计您的故事板,然后针对不同的尺寸等级对其进行定制,使界面适应每种外形尺寸的优势。

Xcode 8 使设计这些高度自适应的视图变得特别容易。您可以切换到特定尺寸特征的编辑模式,甚至可以预览视图控制器在各种设备上的外观。在继续您当前的道路之前,我鼓励您深入研究 Xcode 8 中的改进(如果您还没有的话),看看您是否可以使统一的故事板适用于您的用例。

于 2016-09-09T18:15:23.137 回答