我最近在将一些代码从 iPhone 应用程序移植到 iPad 时遇到了问题。它可能与此处描述的问题有关,尽管我发现该问题的解释/解决方案不令人满意。场景是这样的:
视图控制器“A”(根视图控制器)以“表单”模式呈现样式呈现模式视图控制器(称为“B”)。
视图控制器 B 以“全屏”模式呈现样式呈现视图控制器“C”。
iPad 被旋转,而视图控制器 C 是最顶端的视图控制器。
解除 C 后,重新显示 B,但方向不正确。
据我所知,链接多个呈现的视图控制器不应该有问题——事实上,在从其他视图控制器文档中呈现视图控制器中明确支持这种行为。我还阅读了iOS 5 发行说明中的以下声明:
iOS 5 中的旋转回调不适用于全屏显示的视图控制器。这意味着如果您的代码在另一个视图控制器上显示一个视图控制器,然后用户随后将设备旋转到不同的方向,则在关闭时,底层控制器(即呈现控制器)将不会收到任何旋转回调。但是请注意,呈现控制器在重新显示时将收到 viewWillLayoutSubviews 调用,并且可以从此方法中查询 interfaceOrientation 属性并用于正确布局控制器。
据我所知,这不会发生 - 视图控制器 B 收到对 -shouldAutoRotateToInterfaceOrientation 的调用,但此调用中的 interfaceOrientation 参数的值是视图控制器 B 在呈现视图控制器 C 时的界面方向的值,而不是值解雇时 C 的界面方向。由于我们在 iPad 上,所有这些视图控制器都在 -shouldAutoRotateToInterfaceOrientation 中返回 YES。因此 B 的视图的边界永远不会改变,所以 -willLayoutSubviews 永远不会被调用。
我已经尝试在 B 关闭它之前将视图控制器 C 的方向保存到 B 的回调中,然后在下次调用 -shouldAutoRotateToInterfaceOrientation 时使用该信息,并仅在 C 被关闭时返回 YES。这修复了在未进行此检查的情况下出现的损坏 UI,但视图控制器 B 不会将其界面方向更新为该值,因此后续的模态演示将从设备的错误一侧进行动画输入/输出。
有没有人能够成功获得这样的视图控制器配置?这似乎不是一个不寻常的场景,所以我有点惊讶它没有像我最初预期的那样工作。
提前致谢。