对iPhone 6+旋转的反应 - traitCollectionDidChange:为导航控制器

时间:2015-10-02 12:47:42

标签: ios objective-c uisplitviewcontroller landscape-portrait iphone-6-plus

我使用UISplitViewController。当用户将iPhone 6 Plus旋转成纵向并且不再看到任何细节时,我想显示一个空的选择细节场景。 (所有其他设备的行为都是可以预测的。只有6 Plus可以改变它的外观。)我现在使用split view delegate而不是涉及一些奇怪的查询,但这不是重点。

我想知道如何确定iPhone 6是否旋转成风景。

我想出的最好的想法:对特质环境变化作出反应。主视图控制器始终保持紧凑,只有它的父导航视图控制器从紧凑变为常规并再返回。 (当然,还有UIWindow。)

使用拆分视图控制器时,对于" Master"中UINavigationController的子类,traitCollectionDidChange:在使用iPhone 6 Plus并旋转到横向时将被调用两次。旋转后调用一次。

willTransitionToTraitCollection:withTransitionCoordinator:甚至分别被调用三次和一次。

我想象的是,因为在风景中你可以看到两个视图控制器并排在一起。尽管如此,UINavigationController接收子视图控制器的调用对我来说没有意义。

由于UITraitCollections不包含有关哪个视图控制器受影响的信息,因此我无法确定环境是否可靠地从常规水平尺寸变为紧凑水平尺寸。其中一个特质集合将报告正确的新值,但我无法彼此辨别它们。

如果您使用不同的值多次调用回调,那么您是如何解决这个问题的呢?

1 个答案:

答案 0 :(得分:3)

我知道这是一个旧帖子,但我无法在网上找到同样问题的解决方案,所以这是我的两分钱。

UISplitViewController是一个容器视图控制器。因此,它被视为"显示"即使它上面有视图控制器。在苹果文档中它说:

"视图控制器将特征更改消息转发给其子视图控制器。演示控制器将特征变化转发给他们呈现的视图控制器。"

因此,无论何时在分割视图控制器的大小类中引入更改,它都会调用它的委托及其子代的委托。

有关详情,请查看:https://developer.apple.com/reference/uikit/uicontentcontainer/1621511-willtransitiontotraitcollection

编辑:我刚注意到我没有完全解释为什么UISplitViewController被调用三次。如果在所呈现的视图中未实现willTransitionToTraitCollection:withTransitionCoordinator:它可能遵循Apple为其设置的约定:

"如果在自己的对象中覆盖此方法,请始终在实现中的某个位置调用super,以便UIKit可以将特征更改转发到关联的演示控制器和任何子视图控制器。"

我认为背后的想法是,在子视图控制器的traitCollection中进行更改时,您可能希望更改其兄弟节点的布局和/或数量。为此目的,子控制器的任何更改都必须调用容器,以便它知道什么是相应的并进行相应的调整。但是它无法跟踪哪个更改与其他更改重叠,因此所有更改都已注册。

我的解决方案是通过子类化它们并添加转换逻辑来处理子视图控制器(在我的情况下是UINavigationControllers)而不是splitViewController中的更改。