74 votes

Détection de l'orientation de l'appareil iOS UIDevice

J'ai besoin de détecter quand l'appareil est en orientation portrait afin de pouvoir lancer une animation spéciale. Mais je ne veux pas que ma vue s'oriente automatiquement.

Comment annuler l'autotransformation d'une vue lorsque l'appareil est tourné en mode portrait ? Mon application n'a besoin d'afficher sa vue qu'en mode paysage, mais il semble que je doive également prendre en charge le mode portrait si je veux être en mesure de détecter une rotation en mode portrait.

0 votes

Note. Il est probablement plus moderne d'utiliser simplement viewDidLayoutSubviews qui se chargera de toutes les modifications de la mise en page. (Rappelons que dans un avenir proche, les utilisateurs redimensionneront les applications dans Windows sur les appareils). La mise en page réactive est désormais la norme.

177voto

David M. Syzdek Points 4297

Essayez d'effectuer les opérations suivantes au chargement de l'application ou de votre vue :

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
   addObserver:self selector:@selector(orientationChanged:)
   name:UIDeviceOrientationDidChangeNotification
   object:[UIDevice currentDevice]];

Ajoutez ensuite la méthode suivante :

- (void) orientationChanged:(NSNotification *)note
{
   UIDevice * device = note.object;
   switch(device.orientation)
   {
       case UIDeviceOrientationPortrait:
       /* start special animation */
       break;

       case UIDeviceOrientationPortraitUpsideDown:
       /* start special animation */
       break;

       default:
       break;
   };
}

Ce qui précède vous permettra d'enregistrer les changements d'orientation de l'appareil sans activer l'autorotation de votre vue.


Note

Dans tous les cas, dans iOS, lorsque vous ajoutez un observateur, retirez-le également aux moments appropriés (éventuellement, mais pas toujours, lorsque la vue apparaît/disparaît). Vous ne pouvez avoir que des "paires" de code d'observation/désobservation. Si vous ne le faites pas, l'application se plantera. Le choix de l'endroit où observer/désobserver dépasse le cadre de ce QA. Cependant, vous devez avoir un code "unobserve" pour correspondre au code "observe" ci-dessus.

0 votes

Il y a quelque chose dont tu dois t'occuper ici. (int)device.orientation peut être 1 ou 2 en portrait, 3 ou 4 en paysage. Et il y a un "5" qui signifie que le dispositif est simplement debout sur un bureau, ce qui renvoie comme paysage si vous vérifiez avec UIDeviceOrientationIsLandscape(device.orientation). Vous pouvez obtenir cette réponse "paysage" même si votre application/appareil est en mode portrait.

1 votes

UIDevice ne donne pas d'orientation si l'application démarre et jusqu'à ce que l'application change d'orientation. Autre possibilité pour iOS>5 [UIApplication sharedApplication].statusBarOrientation

0 votes

N'oubliez pas de retirer l'observateur à un endroit approprié (en fonction de l'endroit où vous l'avez ajouté), sinon vous obtiendrez une exception

21voto

Suragch Points 197

Si vous êtes venu à cette question en cherchant comment détecter un changement d'orientation (sans nécessairement vouloir désactiver la rotation), vous devez également savoir que viewWillTransitionToSize qui est disponible à partir d'iOS 8.

Exemple Swift de aquí

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

Et si vous n'avez pas besoin de vous soucier de l'orientation réelle :

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    // do something

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

Exemple en Objective-C de aquí

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

Et si vous n'avez pas besoin de vous soucier de l'orientation réelle (tirée de cette réponse ) :

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    // Do view manipulation here.
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

Voir aussi

3voto

1) Version rapide de la réponse de David 2) Dans le cas où vous voulez toujours détecter l'orientation quand il n'y a pas de changement d'orientation (version Swift de la réponse de Moe à Comment détecter l'orientation de l'appareil sur iOS ? )

    // Initial device orientation
    let orientation: UIInterfaceOrientation = UIApplication.sharedApplication().statusBarOrientation
    if(orientation == UIInterfaceOrientation.Unknown){
        // code for Unknown
    }
    else if(orientation == UIInterfaceOrientation.Portrait){
        // code for Portrait
    }
    else if(orientation == UIInterfaceOrientation.PortraitUpsideDown){
        // code for Portrait
    }
    else if(orientation == UIInterfaceOrientation.LandscapeRight){
        // code for Landscape        
    }
    else if(orientation == UIInterfaceOrientation.LandscapeLeft){
        // ode for Landscape
    }

    // To detect device orientation change
    UIDevice.currentDevice().beginGeneratingDeviceOrientationNotifications()
    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "orientationChanged:",
        name: UIDeviceOrientationDidChangeNotification,
        object: UIDevice.currentDevice())

fonction orientationChanged

func orientationChanged(note: NSNotification)
{
    let device: UIDevice = note.object as! UIDevice
    switch(device.orientation)
    {
        case UIDeviceOrientation.Portrait:
        // code for Portrait
        break
        case UIDeviceOrientation.PortraitUpsideDown:
        // code for Portrait
        break
        case UIDeviceOrientation.LandscapeLeft:
        // code for Landscape
        break
        case UIDeviceOrientation.LandscapeRight:
        // code for Landscape
        break
        case UIDeviceOrientation.Unknown:
        // code for Unknown
        break
        default:
        break
    }
}

1voto

B.Kosmowski Points 87

Si vous ne voulez pas créer d'objet de dispositif, vous pouvez également utiliser

-(void) seObserverForOrientationChanging
{
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(orientationChanged:)
     name:UIDeviceOrientationDidChangeNotification
     object:[UIDevice currentDevice]];
}

- (void) orientationChanged:(NSNotification *)note
{
    if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)){
        //Do something in landscape
    }
    else {
        //Do something in portrait
    }
}

1voto

drekka Points 10020

Si je comprends bien, votre application est uniquement en mode paysage. Vous pouvez simplement spécifier dans la configuration de l'application qu'elle est uniquement en mode paysage et qu'il n'est donc pas nécessaire de se préoccuper de la rotation. L'application démarrera en mode paysage et y restera, quelle que soit l'orientation de l'iPad.

0 votes

Permettez-moi de l'expliquer à l'aide d'un exemple simple. J'ai une application qui est destinée à être visualisée en mode paysage. Ma vue montre une table sur laquelle se trouve une balle. Lorsque l'appareil est tourné en mode portrait, la balle tombe de la table. Tout reste en mode paysage, la table, l'arrière-plan, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X