iOS 13/13.1自動回転は、iOS 12とは異なる動作をするようです。たとえば、私のアプリでは、設定でインターフェイスの向きを縦向きまたは横向きにロックできます。
デバイスに縦向きの回転ロックがあり、supportedInterfaceOrientationsで.landscapeを返す場合、デバイスで縦向きのロック方向を無効にするまで、インターフェイスは縦向きモードのままです。これは、iOS 12では当てはまらないようです。事実、supportedInterfaceOrientationsはiOS 13でも呼び出されません。
UIViewController.attemptRotationToDeviceOrientation()もこのような場合には機能しません。
問題の根本は、アプリの初期化中に一時的にshouldAutorotateをfalseに返し、すべてが初期化されたら、UIViewController.attemptRotationToDeviceOrientation()を呼び出して自動回転をトリガーします。 iOS 12では自動回転をトリガーしますが、iOS 13.1では機能しません。
おそらくiOS 13.1のバグのようです。自動ローテーションをトリガーするにはどうすればよいですか?
編集:iOS 12.4.1もUIViewController.attemptRotationToDeviceOrientation()を無視するようです。 iOS 12.4.1以降では、自動回転に問題があります。
明確にするために、これは私が欲しいものです:
a。 iPhoneで縦向きのロックが設定されている場合でも、必要に応じてインターフェイスを横向きモードに自動回転させます。
b。すべての状況で自動回転をトリガーするUIViewController.attemptRotationToDeviceOrientation()代替。
これを試して、これがあなたが探しているものかどうかを確認してください:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func btnLandscapeClicked(_ sender: Any) {
let value = UIInterfaceOrientation.landscapeLeft.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
@IBAction func btnPortraitClicked(_ sender: Any) {
let value = UIInterfaceOrientation.portrait.rawValue
UIDevice.current.setValue(value, forKey: "orientation")
}
}
extension UINavigationController {
override open var shouldAutorotate: Bool {
get {
if let visibleVC = visibleViewController {
return visibleVC.shouldAutorotate
}
return super.shouldAutorotate
}
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation{
get {
if let visibleVC = visibleViewController {
return visibleVC.preferredInterfaceOrientationForPresentation
}
return super.preferredInterfaceOrientationForPresentation
}
}
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask{
get {
if let visibleVC = visibleViewController {
return visibleVC.supportedInterfaceOrientations
}
return super.supportedInterfaceOrientations
}
}}