web-dev-qa-db-fra.com

"interfaceOrientation" est obsolète dans iOS 8, Comment modifier cette méthode Objective C

J'ai téléchargé une vue SimpleCamera de Cocoa Controls qui utilise cette méthode.

- (AVCaptureVideoOrientation)orientationForConnection
{
    AVCaptureVideoOrientation videoOrientation = AVCaptureVideoOrientationPortrait;
    switch (self.interfaceOrientation) {
        case UIInterfaceOrientationLandscapeLeft:
            videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
            break;
        case UIInterfaceOrientationLandscapeRight:
            videoOrientation = AVCaptureVideoOrientationLandscapeRight;
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            videoOrientation = AVCaptureVideoOrientationPortraitUpsideDown;
            break;
        default:
            videoOrientation = AVCaptureVideoOrientationPortrait;
            break;
    }
    return videoOrientation;
}

le problème est "interfaceOrientation" déconseillé dans iOS 8 mais je ne sais pas quoi et comment le remplacer dans la condition de commutation.

72
GetMe4GetMe

Obtenir l'orientation du périphérique n'est pas correct. Par exemple, le périphérique peut être en mode paysage, mais un contrôleur de vue ne prenant en charge que Portrait restera en mode Portrait.

Au lieu de cela, utilisez ceci:

[[UIApplication sharedApplication] statusBarOrientation]

Un autre avantage est qu’il utilise toujours l’énumération UIInterfaceOrientation, de sorte que très peu de votre code doit être modifié.

142
cetcet

Depuis iOS8, Apple recommande d'utiliser TraitCollections (classes de taille) à la place de interfaceOrientation.

De plus, comme iOS 9 et le nouvel iPad offrent la fonctionnalité "Multitasking", il existe des cas où l'orientation de l'appareil ne correspond pas aux proportions de la fenêtre! (briser l'interface utilisateur de votre application)

Vous devez donc également faire très attention lorsque vous utilisez des classes de taille normale, car elles ne prendront pas nécessairement tout l'écran iPad.

Parfois, TraitCollections ne répond pas à tous vos besoins de conception. Pour ces cas, Apple recommande de comparer les limites de la vue:

if view.bounds.size.width > view.bounds.size.height {
    // ...
}

J'ai été assez surpris, mais vous pouvez regarder la vidéo de la WWDC 2015 Premiers pas avec le multitâche sur iPad sous iOS 9 à 21'15.

Peut-être recherchez-vous vraiment l'orientation de l'appareil et non les proportions de l'écran ou de la fenêtre. Si vous vous souciez de l'appareil photo du périphérique, vous ne devez pas utiliser TraitCollection, ni afficher les limites.

19
vmeyer

En utilisant -orientation _ propriété de UIDevice n'est pas correcte (même si cela pourrait fonctionner dans la plupart des cas) et pourrait conduire à quelques bugs, par exemple UIDeviceOrientation considérer également l'orientation du périphérique s'il est orienté vers le haut ou le bas, il Il n'y a pas de paire dans UIInterfaceOrientation enum pour ces valeurs.
En outre, si vous verrouillez votre application dans une orientation particulière, UIDevice vous donnera l’orientation de l’appareil sans en tenir compte.
De l'autre côté, iOS8 a déconseillé d'utiliser la propriété interfaceOrientation de la classe UIViewController.
Il y a 2 options disponibles pour détecter l'orientation de l'interface:

  • Utiliser l'orientation de la barre d'état
  • Utilisez des classes de taille, sur iPhone, si elles ne sont pas remplacées, elles pourraient vous permettre de comprendre l'orientation actuelle de l'interface.

Ce qui manque encore, c'est un moyen de comprendre le sens d'un changement d'orientation de l'interface, ce qui est très important lors des animations.
Dans la session de WWDC 2014 "Progression du contrôleur de vue dans iOS8", le haut-parleur fournit également une solution à ce problème, à l'aide de la méthode qui remplace -will/DidRotateToInterfaceOrientation.

Voici la solution proposée partiellement mise en œuvre:

-(void) viewWillTransitionToSize:(CGSize)s withTransitionCoordinator:(UIVCTC)t {
    orientation = [self orientationFromTransform: [t targetTransform]]; 
    oldOrientation = [[UIApplication sharedApplication] statusBarOrientation]; 
    [self myWillRotateToInterfaceOrientation:orientation duration: duration]; 
    [t animateAlongsideTransition:^(id <UIVCTCContext>) {
         [self myWillAnimateRotationToInterfaceOrientation:orientation
                                                  duration:duration];
      }
      completion: ^(id <UIVCTCContext>) {
         [self myDidAnimateFromInterfaceOrientation:oldOrientation];
      }];
}
2
Andrea

version de Swift 4+

UIApplication.shared.statusBarOrientation
2
Abhishek Jain