如何根据iOS 9中size大小的变化交换视图控制器?

时间:2016-09-09 17:43:11

标签: ios uiviewcontroller autolayout size-classes adaptive-layout

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

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

在过去的日子里(〜2014年),Apple的建议是:

如果要根据设备是纵向还是横向显示不同的数据,则执行此操作的方法是使用两个单独的视图控制器。一个视图控制器应该管理主要方向(通常是纵向)的数据显示,而另一个视图控制器管理交替方向的数据显示。

尽管尺寸类已经出现,但这仍然是我特定设计的最佳解决方案(记得采用尺寸类和拆分视图,插入帐户。)

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

问题2 :(假设我已经从故事板中加载了备用视图控制器)以响应特征变化,我应该如何最好地转换/呈现备用视图控制器?

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

因为没有人回答原来的问题。

1 个答案:

答案 0 :(得分:0)

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

如果您正在谈论在发布时(iPad与iPhone)的特征变化,只需为这两个设备创建不同的故事板或根视图控制器,并将其设置在您的应用代理中。这种方法的缺点是,如果没有额外的工作,不会为超大尺寸的iPhone提供类似iPad的体验。

我想挑战你说的话:

  

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

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

  

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

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