控制 UIWindow 发送哪个 UIViewController shouldAutorotateToInterfaceOrientation:?

Posted

技术标签:

【中文标题】控制 UIWindow 发送哪个 UIViewController shouldAutorotateToInterfaceOrientation:?【英文标题】:Control which UIViewController a UIWindow sends shouldAutorotateToInterfaceOrientation:? 【发布时间】: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 除外。)

【问题讨论】:

【参考方案1】:

我不确定我能否回答您的主要问题,但就您为什么需要多个视图控制器的示例而言,这些可能只是视图。我已经制作了很多具有多个表视图的应用程序,但我使用的是常规的 UITableView,而不是 UITableViewController。 UITableViewController 几乎只是一个用于管理单个 UITableView 的默认视图控制器,它并没有真正做太多。

听起来您可能正在使用常规视图可能就足够的视图控制器。

【讨论】:

啊,确实。我将 UITableViewController 的角色与 UITableViewDelegate 对象混淆了,它(现在我当然意识到)不需要是同一个对象。感谢您指出这一点。【参考方案2】:

它将是视图控制器的视图首先或最后放置在窗口中(对不起,我忘记了)。这种行为是可预测的,但没有记录,因此容易发生变化,所以不要依赖它。只是不要像其他答案建议的那样同时激活/可见多个视图控制器。

哦,在您的 TabBar 示例中,应该可以继承 UITabBar,或者更好的是,使用委托。所以使用 UITabBarViewController 来管理标签,你应该可以使用自定义视图绘制自己的标签栏。

【讨论】:

不幸的是,在我的应用程序中,它并不是我在视图层次结构中显示的第一个或最后一个控制器。该应用程序始终以相同的顺序创建其控制器,但每次我运行该应用程序时,获取自动旋转事件的控制器都会更改。至于 TabBar,很好——我没想到。

以上是关于控制 UIWindow 发送哪个 UIViewController shouldAutorotateToInterfaceOrientation:?的主要内容,如果未能解决你的问题,请参考以下文章

通过 UIWindow 从继承自 NSObject 的类以模态方式在整个应用程序顶部显示 UIWebView?

为 UIResponder 添加两个监听器

UIWindow statusBar消失

86UIWindow简单介绍

跟踪触摸事件而不覆盖 UIWindow 和 UIApplication 中的发送事件方法

在不同的 UIWindow 上呈现视图控制器