Comment vérifier dans quelle position (paysage ou portrait) est l'iPhone maintenant?

J'ai une application avec une barre d'tabs et des controllers de navigation dans chaque onglet. Lorsque l'user secoue le périphérique, une UIImageView apparaît en tant que vue enfant dans le controller de navigation. Mais UIImageView doit contenir une image spéciale, en fonction de l'orientation actuelle du périphérique.

Si j'écris juste

 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { //Code } else if (interfaceOrientation == UIInterfaceOrientationLandscapeRight||interfaceOrientation == UIInterfaceOrientationLandscapeLeft) { //Code } } 

La vue devient folle si l'user a fait pivoter l'appareil avant de le secouer.

Existe-t-il une méthode pour get l'orientation actuelle des iPhones?

Utilisez la [[UIDevice currentDevice] orientation] , comme spécifié ici .

Voici les macros UIDeviceOrientationIsLandscape et UIDeviceOrientationIsPortrait

donc plutôt en vérifiant séparément vous pouvez le faire comme ça …

 if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) { // code for landscape orientation } 

OU

  if (UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)) { // code for Portrait orientation } 

Comme l'a dit beno, cela semble une meilleure réponse si vous détectez une orientation au début de votre vision. Je n'ai pas pu get la réponse approuvée pour returnner un résultat au début de ma configuration, mais cela fonctionne à merveille.

 if (UIDeviceOrientationIsPortrait(self.interfaceOrientation)){ //DO Portrait }else{ //DO Landscape } 

Pour append à la question déjà répondu:

Vous utilisez l' [[UIDevice currentDevice] orientation] qui donnera l'une de ces valeurs:

 typedef enum { UIDeviceOrientationUnknown, UIDeviceOrientationPortrait, UIDeviceOrientationPortraitUpsideDown, UIDeviceOrientationLandscapeLeft, UIDeviceOrientationLandscapeRight, UIDeviceOrientationFaceUp, UIDeviceOrientationFaceDown } UIDeviceOrientation; 

La documentation peut être trouvée ici – (orientation) et ici – (UIDeviceOrientation) .

(Je ne veux pas prétendre à l'ancienne réponse, mais cette information était trop importante pour un commentaire.)

Vous pouvez également utiliser la propriété interfaceOrientation de la class UIViewController, si vous êtes bloqué et que vous obtenez continuellement UIDeviceOrientationUnknown de UIDevice.

Il y a un bon résumé de pourquoi l'orientation [[UIDevice currentdevice]] peut parfois échouer ici: http://bynomial.com/blog/?p=25 , surtout si vous voulez détecter l'orientation rapidement (par exemple, si vous voulez cochez à droite lorsque l'application sort de l'arrière-plan).

Cela vous aide …

 -(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { if ([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation ]== UIDeviceOrientationLandscapeRight) { NSLog(@"Lanscapse"); } if([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown ) { NSLog(@"UIDeviceOrientationPortrait"); } } 

Vous pouvez également définir des constantes pour gagner du time:

 #define LANDSCAPE UIInterfaceOrientationIsLandscape(self.interfaceOrientation) #define LANDSCAPE_RIGHT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft #define LANDSCAPE_LEFT [UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeRight #define PORTRAIT UIInterfaceOrientationIsPortrait(self.interfaceOrientation) #define PORTRAIT_REVERSE [UIDevice currentDevice].orientation == UIDeviceOrientationPortraitUpsideDown 

Essaye ça:

 [[UIApplication sharedApplication] statusBarOrientation] 

Ou dans Swift 3:

 UIApplication.shared.statusBarOrientation 

Pour vérifier spécifiquement une orientation particulière, vous pouvez également essayer la propriété isLandscape ou isPortrait comme:

 UIApplication.shared.statusBarOrientation.isLandscape 

Le problème avec [[UIDevice currentDevice] orientation] est qu'il returnnera aussi UIInterfaceOrientetionUnknown que statusBarOrientation ne returnne pas.

Il y a aussi une propriété UIViewController "interfaceOrientation" mais elle était déconseillée dans iOS 8, donc ce n'est pas recommandé.

Vous vérifiez la documentation pour statusBarOrientation ici

J'ai fini par vérifier comme ça (Swift 3):

 var isPortrait: Bool { let orientation = UIDevice.current.orientation switch orientation { case .portrait, .portraitUpsideDown: return true case .faceUp: // Check the interface orientation let interfaceOrientation = UIApplication.shared.statusBarOrientation switch interfaceOrientation{ case .portrait, .portraitUpsideDown: return true default: return false } default: return false } } 

Obtenir l'orientation actuelle

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; if (orientation == UIInterfaceOrientationLandscapeLeft) { NSLog(@"Landscape left"); self.lblInfo.text = @"Landscape left"; } else if (orientation == UIInterfaceOrientationLandscapeRight) { NSLog(@"Landscape right"); self.lblInfo.text = @"Landscape right"; } else if (orientation == UIInterfaceOrientationPortrait) { NSLog(@"Portrait"); self.lblInfo.text = @"Portrait"; } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { NSLog(@"Upside down"); self.lblInfo.text = @"Upside down"; } }