在iOS swift 5项目中,我需要在一个场景中支持多个设备方向。
我有以下要求:
- 如果设备是旋转的,设备的方向不应该改变。
- 如果按钮被轻按,设备方向需要改变(左)旋转)
这意味着只有一个UIViewController
用户应该能够通过点击按钮手动改变设备方向,但旋转设备不应该做任何事情。
实现此目的的一个简单方法是在AppDelegate
上设置您支持的方向(_:supportedInterfaceOrientationsFor:)
创建一个本地变量
var orientation: UIInterfaceOrientationMask = .portrait
然后返回该变量作为支持的方向
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return orientation
}
上的ViewController
,你想要旋转一个按钮,你可以改变应用程序委托上支持的方向,然后强制设备方向改变,使视图旋转
private func changeSupportedOrientation() {
let delegate = UIApplication.shared.delegate as! AppDelegate
switch delegate.orientation {
case .portrait:
delegate.orientation = .landscapeLeft
default:
delegate.orientation = .portrait
}
}
@IBAction func rotateButtonTapped(_ sender: UIButton) {
changeSupportedOrientation()
switch UIDevice.current.orientation {
case .landscapeLeft:
UIDevice.current.setValue(UIDeviceOrientation.portrait.rawValue, forKey: "orientation")
default:
UIDevice.current.setValue(UIDeviceOrientation.landscapeLeft.rawValue, forKey: "orientation")
}
}
将强制改变设备的方向,然后旋转视图。如果您再次点击按钮,方向将回到.portrait
请小心使用这个,因为你需要真正考虑你的导航堆栈,以确保只有导航堆栈的顶部支持旋转,并且只有在方向被设置回原来的.portrait
之后才能从导航堆栈弹出。