我有一个应用程序,它使用由多个UIVIewController
对象管理的视图层次结构(* 请参见下面的注释),在任何给定时间都在窗口中可见。因此,我发现它们中的哪一个shouldAutorotateToInterfaceOrientation:
从UIWindow
.
如何确保我的UIWindow
对象调用我的最高级别UIViewController
,而不是它的任何孩子?
这似乎是旋转布局动画和更改正确传播的唯一方式。
在“View Controller Programming Guide”中,iOS 文档指出:
在 iOS 应用程序中,窗口对象完成了与更改当前方向相关的大部分工作。但是,它与应用程序的视图控制器一起工作,以确定是否应该发生方向更改,如果是,应该调用哪些附加方法来响应更改。具体来说,它适用于根视图最近添加到或显示在窗口中的视图控制器。换句话说,window 对象仅适用于最前面的视图控制器,其视图是使用“呈现视图控制器的视图”中描述的机制之一显示的。</p>
但是,我发现我的经历与此不同。当UIWindow
调用shouldAutorotateToInterfaceOrientation
特定的子视图控制器时,即使我从 中删除并重新添加我的顶级视图控制器的视图UIWindow
,它仍然会调用同一个子视图。换句话说,使我的顶级视图控制器成为最近添加的视图是行不通的。
(*)注意:有人指出不建议在同一屏幕上使用多个视图控制器。我断言在各种情况下这是一个不可行的目标。考虑一个同时显示两个表(UITableViewControllers)的应用程序。或者,在我的情况下,由于 UITabBar 的图形/艺术限制,需要模拟 UITabBarController 的自定义视图控制器的应用程序。我没有看到一种方法可以将我的应用程序重构为在任何时候都只显示一个 UIViewController(或其子类)。
更新
没有为 UIWindow 对象为界面方向事件处理所调用的 UIViewController 找到一致的答案(或表现出的行为),我得出的结论是,唯一正确的答案是根本没有答案:只是不要在同一屏幕(UINavigationController 和 UITabBarController 除外。)