Wrong Interface Orientation Reported in iOS 16

5.9k Views Asked by At

I have been using the following to detect the current interface orientation in iOS 14/15:

UIApplication.shared.windows.first!.windowScene!.interfaceOrientation 

Now in iOS 16 Beta (1 and 2), it is reporting incorrectly. Landscape is being reported as Portrait Upsidedown.

2

There are 2 best solutions below

1
Krishnarjun Banoth On BEST ANSWER
 if #available(iOS 16, *) {
        DispatchQueue.main.async {
            let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
            self.setNeedsUpdateOfSupportedInterfaceOrientations()
            self.navigationController?.setNeedsUpdateOfSupportedInterfaceOrientations()
            windowScene?.requestGeometryUpdate(.iOS(interfaceOrientations: .landscape)) { error in
                print(error)
                print(windowScene?.effectiveGeometry ?? "")
            }
        }
        
    } else {
        appDelegate.myOrientation = .landscape
        UIDevice.current.setValue(UIInterfaceOrientation.landscapeRight.rawValue, forKey: "orientation")
        UIView.setAnimationsEnabled(true)
    }

Apple deprecated UIDevice orientation related api's in iOS_16 instead use requestGeometryUpdate method which requests an update to the window scenes geometry.

For detailed information kindly check the following apple developer documentation. requestGeometryUpdate

If you still not able to rotate the device successfully, kindly check the below link for possible root cause and the solution.

UISceneErrorDomain Code=101 issue and solution

0
JustForHelp On

I managed to deal with it in this way:

if (@available(iOS 16, *)) {
    float windowWidth = gameScene.view.window.frame.size.width;
    float windowHeight = gameScene.view.window.frame.size.height;
    
    if (windowWidth > windowHeight) {
        orientation = UIInterfaceOrientationLandscapeLeft;
    } else {
        orientation = UIInterfaceOrientationPortrait;
    }
} else {
    orientation = gameScene.view.window.windowScene.interfaceOrientation;
}