仅支持层次结构中的子 UIViewController 的旋转?

Posted

技术标签:

【中文标题】仅支持层次结构中的子 UIViewController 的旋转?【英文标题】:Supporting rotation on only a child UIViewController in a hierarchy? 【发布时间】:2011-11-05 06:12:16 【问题描述】:

我有一个孩子UIViewController,它是具有UITabBarControllerUINavigationBarController 的层次结构的一部分。我们称它为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 的旋转?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 iOS 中的视图层次结构?

休眠仅保存具有复合主键中的父外键的子表条目

根据呼叫日志状态层次结构计算类别中的唯一客户

如何自定义仅支持横向模式的子视图

多级测试类层次结构中的 Spring @ContextHierarchy(使用 Scala 和 ScalaTest)

您应该在 Angular2 父/子组件层次结构中的哪个点订阅 observable?