Swift 3 犹太版
我把这个留在这里只是为了防止有人遇到问题。
苹果的文档说supportedInterfaceOrientations
:
当用户更改设备方向时,系统会在根视图控制器或填充窗口的最顶部呈现的视图控制器上调用此方法。如果视图控制器支持新方向,则窗口和视图控制器将旋转到新方向。仅当视图控制器的 shouldAutorotate 方法返回 true 时才会调用此方法。
简而言之,您必须supportedInterfaceOrientations
在根视图控制器中覆盖,以便它返回其顶级子视图控制器的值,否则返回默认值。
你应该做的是检查应用程序是否支持所有模式(转到目标常规设置或 Info.plist 中的部署信息),找出你的根视图控制器的类。它可以是通用的 UIViewController、UINavigationController、UITabBarController 或一些自定义类。您可以通过以下方式查看:
dump(UIApplication.shared.keyWindow?.rootViewController)
或者你喜欢的任何其他方式。
让它成为一些CustomNavigationController
。所以你应该像这样覆盖supportedInterfaceOrientations
:
class CustomNavigationController: UINavigationController {
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return topViewController?.supportedInterfaceOrientations ?? .allButUpsideDown
}
}
在任何应该只支持纵向的视图控制器中,例如覆盖supportedInterfaceOrientations
这种方式:
class ChildViewController: UIViewController {
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
}
然后不要忘记检查shouldAutorotate
你的根视图控制器和最上面的视图控制器是否已经返回true
。如果没有,请将其添加到类定义中:
override var shouldAutorotate: Bool {
return true
}
否则supportedInterfaceOrientations
根本不会被调用。
干得好!
如果当只有一个视图控制器应该支持一堆方向而其他视图控制器不支持时,您需要解决相反的问题,请对除此之外的每个视图控制器进行此更改。
希望这会有所帮助。