仅支持层次结构中的子 UIViewController 的旋转?
Posted
技术标签:
【中文标题】仅支持层次结构中的子 UIViewController 的旋转?【英文标题】:Supporting rotation on only a child UIViewController in a hierarchy? 【发布时间】:2011-11-05 06:12:16 【问题描述】:我有一个孩子UIViewController
,它是具有UITabBarController
和UINavigationBarController
的层次结构的一部分。我们称它为ChildViewController
;那么我的层次结构看起来像:
UITabBarController
|
UINavigationViewController [tab 1]
|
SomeParentViewController
|
SomeOtherParentViewController
|
ChildViewController
现在我只希望 ChildViewController
支持旋转到横向。 (它是一个显示聊天视图的视图控制器,对于某些人来说,横向模式更容易打字。)我将方法 - (BOOL) shouldAutorotateToInterfaceOrientation:
添加到 ChildViewController
以声明它支持横向方向,但旋转设备没有效果。通过调试,我发现 – willAnimateRotationToInterfaceOrientation:duration:
没有被调用。
在网上搜索后,我发现UITabBarController
的后代仅支持给定方向,前提是UITabBarController
本身支持该方向。而且,奇怪的是,UITabBarController
仅在其每个选项卡的视图控制器支持旋转时才支持方向。与上面的选项卡 1 一样,其他三个选项卡的视图控制器是 UINavigationViewController
实例;而且,因为我们必须深入,每个UINavigationViewController
仅在其子视图控制器支持方向时才支持方向。
所以此时,将 - (BOOL) shouldAutorotateToInterfaceOrientation:
添加到 SomeParentViewController
和其他 UINavigationController
实例的子代允许 ChildViewController
旋转。但是现在SomeParentViewController
和其他三个选项卡会旋转到横向,看起来很可怕。我只希望ChildViewController
支持横向。
作为一个闩锁努力,我创建了自己的 UITabBarController
子类,名为 RotatingUITabBarController
,并向 ChildViewController
类添加了一个全局标志,让我知道它是否已创建并显示。 RotatingUITabBarController
仅覆盖 - (BOOL) shouldAutorotateToInterfaceOrientation:
并实现为:
if ([ChildViewController isDisplayed])
return ((toInterfaceOrientation == UIInterfaceOrientationPortrait) ||
(toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) ||
(toInterfaceOrientation == UIInterfaceOrientationLandscapeRight));
return NO;
现在,如果我启动应用程序,切换到 SomeParentViewController
或任何其他选项卡并旋转手机不会切换到横向模式,而是保持纵向。到现在为止还挺好。如果我创建并显示ChildViewController
并旋转手机,它会进入横向。到现在为止还挺好。但是现在如果我弹出ChildViewController
来显示SomeOtherParentViewController
,它也是横向的。 SomeParentViewController
和我切换到的所有其他标签也是如此。
我现在没有花招了。任何建议将不胜感激,谢谢!
【问题讨论】:
【参考方案1】:对于您想要的那种行为,也许最好的模型是 YouTube 应用。大多数界面都是纵向的,但播放视频的视图可以纵向或横向工作。
如果您查看该应用程序,您会注意到 UI 的整个选项卡部分实际上是一个模态视图控制器。当您启动应用程序时,标签栏控制器会立即以模态方式呈现。唯一一次离开模态标签栏控制器是在播放视频时——您会注意到整个标签式界面向下滑动以显示视频视图。当视频结束时,标签栏控制器再次模态呈现。
这是“正常”方法的反转,在这种方法中,您仅短暂地使用模态视图控制器,但它在 YouTube 应用中运行良好。它也可能对你有用,也可能对你不好。重要的是让您的应用具有可预测性和流畅性,并让用户始终感到可控。
【讨论】:
以上是关于仅支持层次结构中的子 UIViewController 的旋转?的主要内容,如果未能解决你的问题,请参考以下文章