0

我有一个应用程序,它使用由多个UIVIewController对象管理的视图层次结构(* 请参见下面的注释),在任何给定时间都在窗口中可见。因此,我发现它们中的哪一个shouldAutorotateToInterfaceOrientation:UIWindow.

如何确保我的UIWindow对象调用我的最高级别UIViewController,而不是它的任何孩子?

这似乎是旋转布局动画和更改正确传播的唯一方式。

在“View Controller Programming Guide”中,iOS 文档指出:

在 iOS 应用程序中,窗口对象完成了与更改当前方向相关的大部分工作。但是,它与应用程序的视图控制器一起工作,以确定是否应该发生方向更改,如果是,应该调用哪些附加方法来响应更改。具体来说,它适用于根视图最近添加到或显示在窗口中的视图控制器。换句话说,window 对象仅适用于最前面的视图控制器,其视图是使用“呈现视图控制器的视图”中描述的机制之一显示的。</p>

但是,我发现我的经历与此不同。当UIWindow调用shouldAutorotateToInterfaceOrientation特定的子视图控制器时,即使我从 中删除并重新添加我的顶级视图控制器的视图UIWindow,它仍然会调用同一个子视图。换句话说,使我的顶级视图控制器成为最近添加的视图是行不通的。

(*)注意:有人指出不建议在同一屏幕上使用多个视图控制器。我断言在各种情况下这是一个不可行的目标。考虑一个同时显示两个表(UITableViewControllers)的应用程序。或者,在我的情况下,由于 UITabBar 的图形/艺术限制,需要模拟 UITabBarController 的自定义视图控制器的应用程序。我没有看到一种方法可以将我的应用程序重构为在任何时候都只显示一个 UIViewController(或其子类)。

更新

没有为 UIWindow 对象为界面方向事件处理所调用的 UIViewController 找到一致的答案(或表现出的行为),我得出的结论是,唯一正确的答案是根本没有答案:只是不要在同一屏幕(UINavigationController 和 UITabBarController 除外。)

4

2 回答 2

0

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

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

于 2011-03-22T05:57:21.983 回答
0

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

哦,在您的 TabBar 示例中,应该可以继承 UITabBar,或者更好的是,使用委托。因此,使用 UITabBarViewController 来管理选项卡,您应该能够使用自定义视图绘制自己的选项卡栏。

于 2011-03-22T10:20:34.403 回答