您不能基于视图指定设备轮换规则。它必须在视图控制器的基础上进行设置。这就是 iOS 的工作原理。因此,要实现您所需要的,您必须自己处理。例如,如果您将您的视图显示ARSCNView
为全屏视图,则可以在自定义UIViewController
子类中显示它,并为该控制器设置旋转配置。
为特定视图控制器设置支持的视图旋转可以通过多种方式实现,以下是其中的一些。
方法#1:
UIViewController
您可以通过覆盖您的应用程序委托的方法来设置任何支持的视图方向application:supportedInterfaceOrientationsForWindow:
。
示例代码:
// this goes into your AppDelegate...
// Basically, this checks the current visible view controller type and decide
// what orientations your app supports based on that view controller type (class)
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
let visibleViewController = self.topViewController(withRootViewController: window?.rootViewController)
// Support only portrait orientation for a specific view controller
if visibleViewController is SomeViewController {
return .portrait
}
// Otherwise, support all orientations (standard behaviour)
return .allButUpsideDown
}
// This simple helper method is to extract the exact visible view controller at
// the moment, as `window.rootViewController` could have some container controller
// like `UINavigationController` or so that holds more controllers into it
private func topViewController(withRootViewController rootViewController: UIViewController?) -> UIViewController? {
if let rootViewController = rootViewController as? UITabBarController {
return rootViewController.selectedViewController
} else if let rootViewController = rootViewController as? UINavigationController {
return rootViewController.visibleViewController
} else if let presentedViewController = rootViewController?.presentedViewController {
return topViewController(withRootViewController: presentedViewController)
}
return rootViewController
}
参考:
application:supportedInterfaceOrientationsForWindow:
方法文档
方法#2:
对您的子类进行子类化UINavigationController
并覆盖以下属性:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return self.topViewController?.supportedInterfaceOrientations ?? .all
}
现在这总是查看您的视图控制器supportedInterfaceOrientations
并根据返回值设置支持的方向。这样做可以让你在任何你想要的视图控制器中简单地覆盖它,设置一些自定义值。
例如,SomeViewController
您可以简单地添加:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
参考:
supportedInterfaceOrientations
财产文件
方法#3:
如果您不想UINavigationController
在上面的方法#2中对您的喜欢进行子类化,您可以将您设置SomeViewController
为导航控制器委托实现navigationControllerSupportedInterfaceOrientations(:)
示例代码:
override func viewDidLoad() {
super.viewDidLoad()
// ...
self.navigationController?.delegate = self
}
// MARK: - UINavigationControllerDelegate
func navigationControllerSupportedInterfaceOrientations(_ navigationController: UINavigationController) -> UIInterfaceOrientationMask {
return navigationController.topViewController?.supportedInterfaceOrientations ?? .all
}
参考:
马特的答案在这里