web-dev-qa-db-fra.com

Bogue d'autorotation dans iOS 13

l'autorotation iOS 13/13.1 semble se comporter différemment d'iOS 12. Par exemple, mon application permet à l'utilisateur de verrouiller l'orientation de l'interface en mode portrait ou paysage dans les paramètres.

  1. Si j'ai un verrouillage de rotation du portrait sur l'appareil et que je retourne .landscape dans les interfaces d'interface prises en charge, l'interface reste en mode portrait jusqu'à ce que je désactive l'orientation du verrouillage du portrait sur l'appareil. Cela ne semble pas être le cas avec iOS 12. En fait, supportedInterfaceOrientations n'est même pas appelé dans iOS 13!

  2. UIViewController.attemptRotationToDeviceOrientation () ne fonctionne pas non plus dans de tels cas.

La racine du problème est que je renvoie temporairement shouldAutorotate à false pendant l'initialisation de l'application et lorsque tout est initialisé, j'appelle UIViewController.attemptRotationToDeviceOrientation () pour déclencher l'autorotation. Il déclenche l'autorotation dans iOS 12 mais dans iOS 13.1 cela ne fonctionne pas.

Cela ressemble probablement à un bogue dans iOS 13.1. Que dois-je faire pour forcer le déclenchement de l'autorotation?

EDIT: On dirait que iOS 12.4.1 ignore également UIViewController.attemptRotationToDeviceOrientation (). Il y a quelque chose de cassé dans l'autorotation dans iOS 12.4.1 et supérieur.

Pour être clair, voici ce que je veux:

une. Même si le verrouillage du portrait est défini sur l'iPhone, je souhaite que mon interface tourne automatiquement en mode paysage si nécessaire,

b. UIViewController.attemptRotationToDeviceOrientation () alternative qui déclenche l'autorotation en toutes circonstances.

15
Deepak Sharma

Essayez ceci et voyez si c'est quelque chose que vous recherchez:

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
        }
    }}
0
Amir.n3t