AppDelegate 實(shí)現(xiàn)下面的代理方法,并且判斷對(duì)應(yīng)的旋轉(zhuǎn)方向
static var isPortrait = true
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return AppDelegate.isPortrait ? .portrait : .landscapeLeft
}
需要旋轉(zhuǎn)的 controller 重寫(xiě)下面兩個(gè)屬性,例子中是強(qiáng)制向左旋轉(zhuǎn)
class XXViewController: UIViewController {
override var shouldAutorotate: Bool {
true
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
.landscapeLeft
}
}
iOS 16 之前的版本,需要手動(dòng)調(diào)用 setOrientation 方法。
向左旋轉(zhuǎn)
AppDelegate.isPortrait = false
if #unavailable(iOS 16) {
let value = UIInterfaceOrientation.landscapeLeft.rawValue
if UIDevice.current.responds(to: #selector(setValue(_:forKey:))) {
// 及時(shí)更新旋轉(zhuǎn)的方向,如果不更新,可能造成旋轉(zhuǎn)失敗
_ = (UIApplication.shared.delegate as? AppDelegate)?.application(UIApplication.shared, supportedInterfaceOrientationsFor: view.window)
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
}
}
let vc = XXViewController()
navigationController?.pushViewController(vc, animated: true)
還原旋轉(zhuǎn)方向
AppDelegate.isPortrait = true
if #unavailable(iOS 16) {
let value = UIInterfaceOrientation.portrait.rawValue
if UIDevice.current.responds(to: #selector(setValue(_:forKey:))) {
// 及時(shí)更新旋轉(zhuǎn)的方向,如果不更新,可能造成旋轉(zhuǎn)失敗
_ = (UIApplication.shared.delegate as? AppDelegate)?.application(UIApplication.shared, supportedInterfaceOrientationsFor: view.window)
UIDevice.current.setValue(value, forKey: "orientation")
UIViewController.attemptRotationToDeviceOrientation()
}
}
navigationController?.popViewController()