我将一些视图设计为横向模式,另一些视图设计为纵向模式。我的目标是防止它们旋转。具体来说,我希望横向视图保持横向,纵向视图保持纵向,而不进行任何自动旋转。
我对此进行了广泛的研究并尝试了以下方法:
override func shouldAutorotate() -> Bool {
return false
}
并且:
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
然而,这些方法并没有达到预期的效果。有人对如何为每个视图强制执行固定方向有建议吗?
只需通过覆盖即可获得方向:
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
if UIDevice.current.orientation.isLandscape && flag{
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
print("Landscape")
} else if UIDevice.current.orientation.isPortrait && !flag {
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
print("Portrait")
}
}
并做这样的事情。
此功能不会锁定您的屏幕,但会将屏幕保持在您想要的方向。
您的方向是正确的,但是当用户处于纵向模式时,并且您想要强制用户处于横向模式,因为您的视图是横向的,您必须更改
UIDevice
方向。
UIDevice.current.setValue(UIDeviceOrientation.landscapeLeft.rawValue, forKey: "orientation")
更多 UIDevice 选项,请参阅苹果文档: https://developer.apple.com/documentation/uikit/uideviceorientation
为了确保用户无法返回纵向,您添加:(您已有的代码)
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.landscape
}
在 AppDelegate
中添加此属性和函数 internal var shouldRotate = false
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return shouldRotate ? .landscape : .portrait
}
无论您想在哪里拨打此线路
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.shouldRotate = true