web-dev-qa-db-fra.com

'statusBarOrientation' a été déconseillé dans iOS 13.0 lors de la tentative d'obtention de l'orientation de l'application

En termes simples, je comptais sur le code suivant pour fournir l'orientation de l'application. Ceci est utilisé pour plusieurs raisons dans l'application:

  • Selon les spécifications UX, la disposition de la vue de la pile est définie en fonction de l'orientation pour l'iPad (horizontale en mode paysage, verticale en mode portrait)
  • En s'appuyant sur l'élément précédent, la vue de la pile est placée sur l'écran à gauche (portrait) ou en haut (paysage)
  • Il existe une logique de rotation personnalisée qui répond différemment en fonction de l'état. tl; dr est que sur un iPad, l'application se présente avec des différences importantes entre l'orientation

Je suis juste chargé de la maintenance dans ce scénario et je n'ai pas la possibilité d'apporter des modifications importantes qui s'écartent de la logique de mise en page actuelle (et fonctionnant correctement) en place.

Pour l'instant, il s'appuie sur les éléments suivants pour capturer l'orientation de l'application:

var isLandscape: Bool {
    return UIApplication.shared.statusBarOrientation.isLandscape
}

Cependant, avec la version Xcode 11 GM, je reçois l'avertissement de dépréciation suivant:

'statusBarOrientation' est obsolète dans iOS 13.0: utilisez plutôt la propriété interfaceOrientation de la scène de fenêtre.

Comment puis-je obtenir l'orientation de l'application via la barre d'état?

6
CodeBender

Objective C, iOS 13 et compatible avec les anciennes versions:

+ (BOOL)isLandscape
{
    if (@available(iOS 13.0, *)) {
        UIWindow *firstWindow = [[[UIApplication sharedApplication] windows] firstObject];
        if (firstWindow == nil) { return NO; }

        UIWindowScene *windowScene = firstWindow.windowScene;
        if (windowScene == nil){ return NO; }

        return UIInterfaceOrientationIsLandscape(windowScene.interfaceOrientation);
    } else {
        return (UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication.statusBarOrientation));
    }
}

J'ai ajouté ceci à une catégorie UIWindow.

0
banana1

N'est-ce pas plus facile? (Testé avec Swift 5, iPadOS 13.4)

var isLandscape: Bool {
    return UIDevice.current.orientation.isLandscape
} 

ou essentiellement:

let o = UIDevice.current.orientation
if o == .landscapeLeft || o == .landscapeRight {
    // Use interfaceOrientation
}

Deuxième variante:

if UIDevice.current.orientation.isLandscape {
    // Use interfaceOrientation
}
0
Flori