我的应用程序的视图控制器层次结构设置如下:
UITabBarController
|
UINavigationController
| |
| UIViewController
|
UINavigationController
|
UIViewController
此层次结构中的所有视图控制器都会覆盖该方法:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
并返回YES
- 因此视图控制器应该能够旋转到任何旋转 - 甚至是颠倒。
但是,在此设置中,没有一个视图控制器成功旋转。我的印象是导航和标签栏控制器会在视图控制器响应旋转时旋转。
为什么我的视图控制器不会旋转?
我能够让它们旋转的唯一方法是通过继承UINavigationController
并覆盖它的shouldAutorotate
方法,但这对我来说感觉不必要,我想知道我是否有什么东西错过了这项工作。
根据用户体验编码方法:
如果您还使用工具栏,则每个工具栏项的视图控制器必须实现shouldAutorotateToInterfaceOrientation:方法,并为您希望支持的每个方向返回YES。如果您有一个工具栏项的导航控制器,该导航控制器的根视图控制器必须实现shouldAutorotateToInterfaceOrientation:方法并返回YES。
它说'工具栏' - 但我认为这是一个错字,可能应该是'标签栏'。
所以我似乎正确地实现了这一点,但我的控制器仍然没有自动旋转。
答案 0 :(得分:4)
我遇到了这个问题,但我不记得它发生的确切原因。标签栏控制器要求其所有视图控制器在询问其旋转到该方向的特定方向时响应YES。
如果以模态方式呈现,似乎与底层VC系统无关。
我已经创建了一个测试来展示这个(RotationTest on GitHub),但这一切似乎都在起作用。希望我能记住为什么我在某个时候失败了。
答案 1 :(得分:0)
您是否尝试过将Tabbarcontroller子类化并将其设置为tabbarcontroller?在那里,设置
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
到
YES
答案 2 :(得分:0)
我能够让它们旋转的唯一方法是通过继承UINavigationController并覆盖它的shouldAutorotate方法,但这对我来说感觉不必要,我想知道是否有一些我错过了这项工作。
我不确定这是否是错误的方法,但我会比UINavigationController更早地继承UITabBarController。此外,您可以尝试将所有内容包装在实现旋转方法的子类UIViewController中,但这会产生额外视图的开销。我曾经尝试用UINavigationController进行旋转,但它并不漂亮。我怀疑,如果您继承UINavigationController,视图仅旋转的原因是视图层次结构将仅在父项旋转时传递旋转。如果父母不旋转,孩子不会。 (想象一下iPhone中的iPhone。如果底座旋转,iPhone只能旋转。现在,将底座与iPhone外壳进行比较。外壳也可以旋转,因此iPhone也会旋转。)
它说'工具栏' - 但我认为这是一个错字,可能应该是'标签栏'。
我不认为HIG在这方面有错字。这些条款可以互换。
通常,“工具栏”与包含它的视图相关,因此应与其父视图一起旋转。但是,标签栏是“父”,可以说是屏幕上的视图控制器。因此,视图控制器只应在整个应用程序旋转时旋转。这个概念基本归结为:哪个视图(条形图或视图控制器)依赖于另一个视图? (标签栏是持久的,但视图会更改,或者只有视图可见时才是工具栏。)
答案 3 :(得分:0)
UITabBarController以及UINavigationController的子类。它使用xCode 4.4。
答案 4 :(得分:0)
我开发了一个扩展,允许你在没有继承UITabBarController https://github.com/piercifani/TabBarBetterRotation的情况下做到这一点