Dear UIKit Engineers,
I have reproduced the issue with very basic code that disables autorotation on startup and then after 0.2 seconds fires a notification to autorotate. Just create a new project and in ViewController, replace this code. It's shocking that this bug is there in iOS 16. Run this code through XCode debugger while holding iPhone in Portrait mode. and everything runs fine. But if the app is launched directly on iPhone 13 Pro by touching the app icon (and while holding iPhone in portrait mode), it doesn't autorotates to portrait mode (or to be specific, function viewWillTransition() is not called upon autorotation which creates all issues) ! Please do provide workaround as I desperately need it.
I have filed FB11516363 for the same issue.
import UIKit
class ViewController: UIViewController {
public var windowOrientation: UIInterfaceOrientation {
return view.window?.windowScene?.interfaceOrientation ?? .unknown
}
private var disableAutoRotation = true
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
var orientations:UIInterfaceOrientationMask = .landscapeRight
if !self.disableAutoRotation {
orientations = .all
}
return orientations
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.backgroundColor = UIColor.systemGreen
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2, execute: {
self.autoRotateNotification()
})
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
let orientation = windowOrientation
coordinator.animate(alongsideTransition: {_ in
}, completion: { [unowned self] (UIViewControllerTransitionCoordinatorContext) -> Void in
let orient = self.windowOrientation
if orient.isLandscape {
self.view.backgroundColor = UIColor.systemGreen
} else {
self.view.backgroundColor = UIColor.systemOrange
}
})
}
func autoRotateNotification() {
DispatchQueue.main.asyncAfter(deadline: .now(), execute: {
/*
* HELP::: This code does something only when debug directly from XCode,
* not when directly launching the app on device!!!!
*/
self.disableAutoRotation = false
if #available(iOS 16.0, *) {
UIView.performWithoutAnimation {
self.setNeedsUpdateOfSupportedInterfaceOrientations()
}
} else {
// Fallback on earlier versions
UIViewController.attemptRotationToDeviceOrientation()
}
})
}
}