ios - 对 iPhone 6+ 旋转使用react——traitCollectionDidChange : called twice for nav controller

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

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

我想知道如何确定 iPhone 6 是否旋转为横向。

我想出的最好主意:对特质环境变化使用react。主视图 Controller 始终保持紧凑,只有它的父导航 View Controller 从紧凑变为常规并再次变回。 (当然还有 UIWindow。)

使用 Split View Controller 时,对于 UINavigationController 的子类在“大师”中,traitCollectionDidChange:使用 iPhone 6 Plus 并旋转到横向时将被调用两次。旋转回来时调用一次。
willTransitionToTraitCollection:withTransitionCoordinator:甚至分别被调用了 3 次和 1 次。

我想那是因为在风景中你可以看到两个 View Controller 并排。 UINavigationController 对我来说没有意义不过,完全接收到对 subview Controller 的调用。

由于UITraitCollections不包含有关哪个 View Controller 受到影响的信息,我无法确定环境是否可靠地从常规更改为紧凑的水平尺寸。其中一个特征集合将报告正确的新值,但我无法将它们彼此区分开来。

你是如何解决这个问题的,既然回调被多次调用并具有不同的值?

最佳答案

我知道这是一个旧线程,但我在网上找不到相同问题的解决方案,所以这是我的两分钱。

UISplitViewController 是一个容器 View Controller 。所以即使它上面有 View Controller ,它也被认为是“显示的”。在苹果文档中它说:

“ View Controller 将特征更改消息转发给他们的 subview Controller 。表示 Controller 将特征更改转发给他们呈现的 View Controller 。”

因此,每当您在 Split View Controller 的大小类中引入更改时,它都会将其称为委托(delegate)及其两个子项的委托(delegate)。

欲了解更多信息,请查看:https://developer.apple.com/reference/uikit/uicontentcontainer/1621511-willtransitiontotraitcollection

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

“如果您在自己的对象中覆盖此方法,请始终在您的实现中的某个时刻调用 super ,以便 UIKit 可以将特征更改转发到关联的表示 Controller 和任何 subview Controller 。”

我认为它背后的想法是,在更改 subview Controller 的 traitCollection 时,您可能想要更改其 sibling 的布局和/或数量。为此目的,子 Controller 中的任何更改都必须调用容器,以便它知道发生了什么并相应地进行调整。但是,它无法跟踪哪些更改与其他更改重叠,因此所有更改都已注册。

我的解决方案是通过子类化并添加转换逻辑来处理 subview Controller (在我的情况下为 UINavigationControllers)而不是 splitViewController 中的更改。

关于ios - 对 iPhone 6+ 旋转使用react——traitCollectionDidChange : called twice for nav controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32907534/

相关文章:

ios - 第二个主从方案在 SplitViewController 中无法正确加载

ios - CoreData 查询返回零最初基于子对象 - 但退出后所有数据都存在

ios - 如何使用 GraphicContext 在 Objective C 中获得锥形线笔刷效果

ios - 字符串的大写 NSArray?

ios - 检查当前是否使用定位服务

objective-c - Seam Carving – 访问 cocoa 中的像素数据

ios - 将数据从 UIViewController 传递到 UISpiltView

ios - 根据 IOS 版本显示不同的启动图像

ios - 根据用户角色重用 UIViewController 子类的 Storyboard UI

ios - 使用 iPhone 类的 iPad 主从 View