我用 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/