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.

0voto

.UIDeviceOrientationDidChange la notification est appelée plusieurs fois sur l'iphone même si l'appareil n'a pas tourné. Je ne connais pas la raison, mais si vous n'en avez besoin que lorsque l'appareil a vraiment tourné, alors faites ce qui suit.

NotificationCenter.default.addObserver(self, selector: #selector(orientationChanged), name: .UIDeviceOrientationDidChange, object: nil)

La méthode appelée par l'observateur doit ressembler à ceci :

func orientationChanged() {

    if traitCollection.isIphone {

        defer {
            self.previousTraitCollectionForIphone = traitCollection
        }

        guard let previousTraitCollectionForIphone = previousTraitCollectionForIphone else {

            updateView()
            return
        }

        if previousTraitCollectionForIphone != traitCollection {
            updateView()
        }

    } else {
        updateView()
    }
}

0voto

eharo2 Points 360

Dans Swift 5.0.

DeviceOrientation vs ScreenSize vs StatusBar.isLandscape ?

Si vous voulez détecter les changements d'orientation en arrière-plan, et si vous avez également besoin de détecter les changements de visage vers le haut/bas, consultez ce lien Dans Swift, comment obtenir l'orientation correcte de l'appareil juste après son lancement ?

Il couvre la manière de détecter correctement l'orientation dans Swift en utilisant 3 manières alternatives de le faire : - viewWillTransitionToSize() - Utilisation de l'observateur - Utilisation de la barre d'état

0voto

snibbe Points 1194

Voici un peu de code supplémentaire pour éviter les réinitialisations ou transitions intempestives de l'interface utilisateur :

- (void) orientationChanged:(NSNotification *)note
{
    UIDeviceOrientation newOrientation = ((UIDevice*)note.object).orientation;

    // don't do anything if device is flat...
    if (UIDeviceOrientationIsFlat(newOrientation) || newOrientation == UIDeviceOrientationUnknown)
        return;

    // ... and only if orientation has changed
    if (newOrientation != self->lastOrientation) {
        // do whatever you need to do to change UI

        self->lastOrientation = newOrientation;
    }
}

0voto

Chiquis Points 5891

D'abord, désactivez tout sauf l'orientation que vous voulez (pour qu'il n'y ait pas de rotation).

Ensuite, comme David l'a dit, il suffit d'obtenir l'orientation actuelle de l'appareil :

https://developer.apple.com/library/ios/#documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/MotionEvents/MotionEvents.html

Vous pouvez également utiliser l'accéléromètre vous-même (puisque c'est ainsi que cela se passe de toute façon). et vérifier où se trouve la gravité pour voir quelle orientation elle a. Si vous adoptez cette approche, vous pouvez jouer avec les valeurs vous-même pour obtenir des résultats différents.

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