如何防止在iOS 11上轮换?

时间:2018-02-18 16:50:25

标签: rotation orientation ios11

从iOS 11.2开始,我注意到不再调用(BOOL)shouldAutorotate, (BOOL)shouldAutorotateToInterfaceOrientation, (UIInterfaceOrientationMask)supportedInterfaceOrientations等。

如何防止旋转到某个方向?

我可以在目标的部署级别关闭旋转,但实际上我希望它关闭iPhone X的旋转只是。我有一个没有故事板的旧应用程序,并且'不'我想改变应用程序以在横向模式下尊重屏幕中的愚蠢缺口。

Landscape在我的App中非常有用,因为在iPhone上你可以在横向模式下获得更宽的键盘,这很不错。否则,我将删除所有iPhone型号的旋转..

它位于UIViewController的文档中:

  

“从iOS 8开始,所有与轮换相关的方法都被弃用。相反,轮换被视为视图控制器视图大小的变化,因此使用...进行报告。”

  

“您可以覆盖preferredInterfaceOrientationForPresentation ..”

但也没有调用。不在根视图控制器中,也不在其他视图控制器中。

那么,如何以编程方式阻止现在轮换到某个方向?

1 个答案:

答案 0 :(得分:7)

正如documentation

中所述
  

视图控制器可以覆盖supportedInterfaceOrientations方法以限制支持的方向列表。

因此,我们需要覆盖shouldAutorotatesupportedInterfaceOrientation以定位view controllers

  

通常,系统仅在窗口的根视图控制器或显示的视图控制器上调用此方法以填充整个屏幕。

如果您的配置非常简单,例如您的目标view controllerrootViewController window或正在展示整个屏幕,那么这将有效。

但是如果您有其他配置,例如target view controller嵌入在UINavigationControllerUITabBarController等其他容器视图控制器中,那么现在应用程序的窗口只会询问其rootViewControllercontainer view controllersupportedInterfaceOrientation

现在进一步阅读文档,

  

子视图控制器使用父视图控制器为其提供的窗口部分,不再直接参与有关支持旋转的决策。

因此可能是这些容器视图控制器的默认实现,而不是要求孩子有supportedInterfaceOrientation首选项。

因此,为了让我们的目标child view controller指定supportedIntefaceOrientation,我们需要告诉容器视图控制器这样做。

如果是UINavigationController

extension UINavigationController {
  open override var shouldAutorotate: Bool {
    return true
  }

  open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
      return topViewController?.supportedInterfaceOrientations ?? .allButUpsideDown
  }
}

以防万一或UITabBarController

extension UITabBarController {
  open override var shouldAutorotate: Bool {
      return true
  }

  open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
      return selectedViewController?.supportedInterfaceOrientations ?? .allButUpsideDown
  }
}