【问题标题】:Temporarily restrict app to specific orientation暂时将应用程序限制为特定方向
【发布时间】:2015-12-02 21:35:09
【问题描述】:

我有一个支持所有方向的应用程序,但在某些情况下,我想暂时将其限制为仅纵向。它不是只需要纵向的视图控制器和可以是任何方向的视图控制器的混合,而是我想在用户单击屏幕上的按钮时禁用方向更改,而视图控制器保持不变。

在寻找限制UIViewController 的UI 方向的方法时,弹出的方法是supportedInterfaceOrientations()preferredInterfaceOrientationForPresentation()。两者都不适合我:

  • supportedInterfaceOrientations() 在视图加载时只运行一次,所以即使我将它的返回值设置为有条件的,它也不会在条件更改后运行。
  • 我的视图控制器显示在导航堆栈中,而不是模态显示,因此 preferredInterfaceOrientationForPresentation() 根本不运行。

有什么方法可以达到我想要的效果吗?

【问题讨论】:

  • 当你说supportedInterfaceOrientations()只在视图加载时运行,你是什么意思?你能详细说明这一点吗?
  • 意思是当viewController初始化并加载时,方法运行。然后用户点击一个按钮并设置一个标志来限制方向。然后,如果我旋转设备,它就会旋转,我可以在调试器中看到 supportedInterfaceOrientations() 在第一次之后再也没有运行过。我可以通过再次调用该方法来强制操作系统在支持的方向上刷新其数据吗?

标签: ios uiviewcontroller uiinterfaceorientation


【解决方案1】:

我将假设您的视图控制器位于导航控制器中。如果没有导航控制器,只要设备旋转,就会调用supportedInterfaceOrientations()。然而,当嵌入导航控制器时,导航控制器决定视图控制器是否应该旋转。 (见下面的例子)

你需要做什么?在自定义 UINavigationController 中实现 supportedInterfaceOrientations(),如下所示:

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if self.topViewController is RootViewController {
        return .Portrait
    } else {
        return .All
    }
}

这是this 的重复问题,但我没有看到一个快速的例子。对于您想要保持纵向的任何类,只需将 RootViewController 替换为类名即可。

【讨论】:

  • 啊!那个导航控制器!每次都吸引我!
  • 显然UITabBarController 也有同样的问题。将相同的覆盖添加到自定义 UITabBarController 可以解决此问题。
  • 绝对是容易被忽视的东西!
猜你喜欢
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 2014-03-12
  • 2011-05-01
  • 1970-01-01
相关资源
最近更新 更多