3

我的应用程序有一个视图控制器层次结构,如下所示:

UITabBarController
    |
    UINavigationController
    |  |
    |  UIViewController
    |
    UINavigationController
       |
       UIViewController

我在此层次结构中的所有视图控制器都覆盖了该方法:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

并返回YES- 因此视图控制器应该能够旋转到任何旋转 - 甚至倒置。

但是,在此设置中,没有一个视图控制器成功旋转。我的印象是,如果视图控制器响应旋转,导航和标签栏控制器会旋转。

为什么我的视图控制器不会旋转?

我能够让它们旋转的唯一方法是子类化UINavigationController和覆盖它的shouldAutorotate方法,但这对我来说没有必要,我想知道我是否错过了一些东西来完成这项工作。

编辑:

根据用户体验编码方法:

如果您还使用工具栏,则每个工具栏项的视图控制器必须实现 shouldAutorotateToInterfaceOrientation: 方法并为您希望支持的每个方向返回 YES。如果您有一个用于工具栏项的导航控制器,则该导航控制器的根视图控制器必须实现 shouldAutorotateToInterfaceOrientation: 方法并返回 YES。

它说“工具栏”-但我认为这是一个错字,可能应该是“标签栏”。

所以看来我正确地实现了这一点,但我的控制器仍然没有自动旋转。

4

5 回答 5

4

我遇到了这个问题,但我不记得它发生的确切原因。标签栏控制器要求其所有视图控制器在询问特定方向时响应“是”以使其旋转到该方向。

如果以模态方式呈现,似乎与底层 VC 系统无关。

我已经创建了一个测试来展示这一点(GitHub 上的 RotationTest),但这一切似乎都在工作。希望我能记得为什么我在某个时候失败了。

于 2011-01-30T16:24:03.143 回答
0

您是否尝试过将 Tabbarcontroller 子类化并将其设置为您的 tabbarcontroller?在那里,设置

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation

YES
于 2011-01-30T15:09:37.073 回答
0

我能够让它们旋转的唯一方法是继承 UINavigationController 并覆盖它的 shouldAutorotate 方法,但这对我来说没有必要,我想知道我是否错过了一些东西来完成这项工作。

我不确定这是否是错误的方法,但我会比 UINavigationController 更快地将 UITabBarController 子类化。此外,您可以尝试将所有内容包装在实现旋转方法的子类 UIViewController 中,但这会产生额外视图的开销。我曾经尝试在 UINavigationController 中进行旋转,但它并不漂亮。我怀疑只有在子类化 UINavigationController 时视图才会旋转的原因是视图层次结构只会在父级旋转时传递旋转。如果父母不旋转,孩子不会。(想象一个 iPhone 在底座中。只有底座旋转时 iPhone 才能旋转。现在,将底座与 iPhone 外壳进行比较。外壳也可以旋转,所以 iPhone 也会旋转。)

它说“工具栏”-但我认为这是一个错字,可能应该是“标签栏”。

我认为 HIG 在这方面没有错字。这些术语可以互换。

通常,“工具栏”与包含它的视图相关,因此应该随其父视图一起旋转。然而,标签栏是屏幕上视图控制器的“父级”。因此,视图控制器应该仅在整个应用旋转时才旋转。这个概念基本上可以归结为:哪个视图(栏或视图控制器)依赖于另一个?(标签栏是持久的,但视图会发生变化,或者工具栏只有在视图可见时才会出现。)

于 2011-01-30T15:19:19.597 回答
0

子类化 UITabBarController 以及 UINavigationController。它与使用 xCode 4.4 一样工作。

于 2012-08-16T22:42:16.713 回答
0

我开发了一个扩展,它允许您在不继承 UITabBarController https://github.com/piercifani/TabBarBetterRotation的情况下做到这一点

于 2012-08-18T19:58:12.157 回答