如何防止在iOS 11上轮换?

Ric*_*sen 3 rotation orientation ios11

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

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

我可以在目标的部署水平关闭旋转,但我真正想要关掉旋转只是为iPhone X.我有没有故事板,旧的应用程序,并且不想改变应用程序兑现傻在横向模式下切入屏幕.

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

它在以下文档中UIViewController:

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

和:

"你可以覆盖preferredInterfaceOrientationForPresentation .."

但这也没有被称为.不在根视图控制器中,也不在其他视图控制器中.

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

Rat*_*ain 7

文档中所述

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

所以我们需要覆盖shouldAutorotatesupportedInterfaceOrientation定位view controllers.

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

如果您的配置非常简单,例如您的目标view controller是覆盖整个屏幕rootViewController,window或者正在呈现覆盖整个屏幕,那么这将起作

但是当你有其他配置,比如你的target view controller其他容器视图控制器中嵌入了UINavigationController或者UITabBarController,所以现在应用程序的窗口只会询问它rootViewController(现在container view controller)supportedInterfaceOrientation.

现在进一步阅读文档,

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

因此可能是这些容器视图控制器的默认实现,而不是要求孩子有supportedInterfaceOrientation偏好.

因此,要允许我们的目标child view controller指定那里,supportedIntefaceOrientation我们需要告诉容器视图控制器这样做.

的情况下 UINavigationController

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

  open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
      return topViewController?.supportedInterfaceOrientations ?? .allButUpsideDown
  }
}
Run Code Online (Sandbox Code Playgroud)

如果或是 UITabBarController

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

  open override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
      return selectedViewController?.supportedInterfaceOrientations ?? .allButUpsideDown
  }
}
Run Code Online (Sandbox Code Playgroud)