72 votes

Comment détecter l'orientation de l'appareil sur iOS ?

J'ai une question sur la façon de détecter l'orientation de l'appareil sur iOS. Je n'ai pas besoin de recevoir des notifications de changement, juste l'orientation actuelle elle-même. Cette question semble être assez simple, mais je n'ai pas réussi à la résoudre. Voici ce que j'ai fait jusqu'à présent :

UIDevice *myDevice = [UIDevice currentDevice] ;
[myDevice beginGeneratingDeviceOrientationNotifications];
UIDeviceOrientation deviceOrientation = myDevice.orientation;
BOOL isCurrentlyLandscapeView = UIDeviceOrientationIsLandscape(deviceOrientation);
[myDevice endGeneratingDeviceOrientationNotifications];

Dans mon esprit, cela devrait fonctionner. J'active l'appareil pour qu'il reçoive des avis d'orientation de l'appareil, puis je demande quelle est son orientation, mais cela ne fonctionne pas et je ne sais pas pourquoi.

0 votes

0 votes

120voto

Moe Points 1833

Un vieux sujet, mais aucune solution réelle.

J'avais le même problème, mais j'ai découvert que l'obtention de The UIDeviceOrientation n'est pas toujours cohérente, donc à la place j'utilise ceci :

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

if(orientation == 0) //Default orientation 
    //UI is in Default (Portrait) -- this is really a just a failsafe. 
else if(orientation == UIInterfaceOrientationPortrait)
    //Do something if the orientation is in Portrait
else if(orientation == UIInterfaceOrientationLandscapeLeft)
    // Do something if Left
else if(orientation == UIInterfaceOrientationLandscapeRight)
    //Do something if right

5 votes

C'est la réponse la plus correcte si je peux me permettre. De cette façon, vous pouvez obtenir l'orientation de l'interface à tout moment en vérifiant simplement cette propriété. Notez que peu importe que la barre d'état soit cachée ou non, la propriété sera mise à jour quoi qu'il arrive !

3 votes

Si vous êtes pointilleux et que vous choisissez de ne pas compter sur la sécurité, n'oubliez pas UIInterfaceOrientationPortraitUpsideDown .

0 votes

Cela fonctionne pour moi, sauf qu'il ne détectait pas du tout le portrait. J'ai dû détecter si c'était à droite ou à gauche et, si ce n'était ni l'un ni l'autre, le traiter comme un portrait.

76voto

TONy.W Points 817

Si UIViewController :

if (UIDeviceOrientationIsLandscape(self.interfaceOrientation))
{
    // 
}

si UIView :

if (UIDeviceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation))
{
    //
}

UIDevice.h :

#define UIDeviceOrientationIsPortrait(orientation)  ((orientation) == UIDeviceOrientationPortrait || (orientation) == UIDeviceOrientationPortraitUpsideDown)
#define UIDeviceOrientationIsLandscape(orientation) ((orientation) == UIDeviceOrientationLandscapeLeft || (orientation) == UIDeviceOrientationLandscapeRight)

Mise à jour de :

ajoutez ce code à xxx-Prefix.pch puis vous pourrez l'utiliser partout :

// check device orientation
#define dDeviceOrientation [[UIDevice currentDevice] orientation]
#define isPortrait  UIDeviceOrientationIsPortrait(dDeviceOrientation)
#define isLandscape UIDeviceOrientationIsLandscape(dDeviceOrientation)
#define isFaceUp    dDeviceOrientation == UIDeviceOrientationFaceUp   ? YES : NO
#define isFaceDown  dDeviceOrientation == UIDeviceOrientationFaceDown ? YES : NO

l'usage :

if (isLandscape) { NSLog(@"Landscape"); }

1 votes

C'est une très bonne réponse. J'ai vérifié deux fois avec la documentation - plus qu'une excellente réponse, c'est une réponse correcte du point de vue de la correctitude. Elle mérite d'être marquée comme Vérifiée.

1 votes

C'est tout ce que j'ai toujours voulu dans une explication de la détermination de l'orientation du dispositif. Merci TONy. W

0 votes

Il est intéressant de noter que seul "isLandscape" semble fonctionner correctement sur mon simulateur iPad (tous les autres renvoient NO). Je n'ai pas encore eu l'occasion de tester sur mon vrai matériel ... mais j'aime votre approche. Merci.

9voto

Jasarien Points 35353

UIViewController a un interfaceOrientation à laquelle vous pouvez accéder pour connaître l'orientation actuelle d'un contrôleur de vue.

Quant à votre exemple, il devrait fonctionner. Quand vous dites que ça ne marche pas, que voulez-vous dire ? Quels résultats vous donne-t-il par rapport à ce que vous attendiez ?

1 votes

Je l'ai débogué dans le simulateur iOS, et quelle que soit l'orientation de l'appareil, il renvoie toujours NO. Lorsque j'ai placé un point d'arrêt, j'ai découvert que la sortie de deviceOrientation = myDevice.orientation est toujours UIDeviceOrientationUnknown, donc il ne semble pas qu'il suive l'orientation correctement.

4voto

Gros Points 467

N'a pas été satisfait par "UIDeviceOrientation" parce que lorsque l'orientation d'un UIViewcontroller est fixée à une orientation spécifique, vous n'obtenez pas d'information pertinente sur l'orientation du dispositif, donc la bonne chose à faire est d'utiliser "UIInterfaceOrientation" .

Vous pouvez obtenir l'orientation à partir du UIViewController à l'aide de la fonction "self.interfaceOrientation" mais lorsque vous factorisez notre code, vous pouvez avoir besoin d'effectuer ce type de test en dehors d'un contrôleur de vue (vue personnalisée, catégorie ), de sorte que vous pouvez toujours accéder à l'information n'importe où en dehors du contrôleur en utilisant la balise Contrôleur de la vue racine :

if (UIInterfaceOrientationIsLandscape(view.window.rootViewController.interfaceOrientation)) {
}

1voto

Martin Lütke Points 130

Avez-vous déverrouillé le verrou matériel pour l'orientation de l'appareil ? Il y en a un sur le bord de mon iPad 1.

0 votes

Mais ça ne fonctionne déjà pas dans le simulateur iOS... je ne l'ai même pas encore mis sur l'appareil.

0 votes

@JusmanX Il y a une question connexe à la SO : uidevice-currentdevice-orientation-always-null

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