iOS 13 / 13.1自动旋转的行为似乎与iOS 12不同。例如,我的应用允许用户在设置中将界面方向锁定为纵向或横向模式。
如果我在设备上具有纵向旋转锁定,并在supportedInterfaceOrientations中返回.landscape,则该界面将保持纵向模式,直到我在设备上禁用纵向锁定方向为止。在iOS 12中似乎并非如此。事实上,在iOS 13中甚至没有调用supportedInterfaceOrientations!
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()替代方案,它会在所有情况下触发自动旋转。
答案 0 :(得分:1)
在iOS 12.4.1中,应将“视图控制器”设置为“全屏”以遵守自动旋转方向。
let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen
self.present(vc, animated: true, completion: nil)
答案 1 :(得分:0)
尝试一下,看看这是否是您要找的东西:
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
}
}}
答案 2 :(得分:0)
这对其他遇到此问题的人来说是有效的。转到项目设置“常规”>“部署信息”,并确保已选中“需要全屏显示”设置。
然后将以下代码粘贴到viewDidLoad块之后:
// Forbid autorotate
override open var shouldAutorotate: Bool {
return false
}
// Specify the orientation
override open var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscape
}