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