Obtenez l'orientation de lancement de l'application iPad

Dans mon application iPad, je dois exécuter un code de layout pour définir la layout appropriée en fonction de l'orientation. Par défaut, la layout est configurée pour l'orientation paysage, donc dans le cas où l'application démarre en mode portrait, j'ai besoin de prendre des mesures supplémentaires pour configurer les vues correctement pour l'affichage en mode portrait.

Dans ma -application:didFinishLaunchingWithOptions: méthode, je vérifie l'orientation en utilisant l'orientation [[UIDevice currentDevice] orientation] . Le problème ici est qu'il returnne toujours le portrait même si l'application commence en paysage. Y at-il un moyen de contourner cela?

C'est un comportement attendu. À propos de la documentation de UIViewController :

Remarque: Au moment du lancement, les applications doivent toujours configurer leur interface dans une orientation portrait. Après l' application:didFinishLaunchingWithOptions: méthode renvoie, l'application utilise le mécanisme de rotation du controller de vue décrit ci-dessus pour faire pivoter les vues à l'orientation appropriée avant d'afficher la window.

En d'autres termes, en ce qui concerne l'appareil, l'orientation est portrait pendant le lancement de l'application. À un certain point après l' application:didFinishLaunchingWithOptions: il détectera l'orientation différente et appellera votre méthode shouldAutorotateToInterfaceOrientation: et ensuite vos autres methods de rotation de vue , que vous devriez gérer normalement.

C'est le meilleur moyen de vérifier l'orientation au lancement. Commencez par créer une nouvelle méthode dans votre AppDelegate qui vérifie l'orientation:

 -(void)checkLaunchOrientation:(id)sender{ UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; BOOL isLandscape = UIDeviceOrientationIsLandscape(self.viewController.interfaceOrientation); if (UIInterfaceOrientationIsLandscape(orientation) || isLandscape) { //do stuff here } } 

A la fin de -application:didFinishLaunchingWithOptions: run

  [self performSelectorOnMainThread:@selector(checkLaunchOrientation:) withObject:nil waitUntilDone:NO]; 

Utilisez self.interfaceOrientation dans votre controller de vue – c'est une propriété de UIViewController qui est définie par iOS pour vous, et dans certains cas, elle est plus fiable que l' [[UIDevice currentDevice] orientation] .

Voici une description détaillée: http://bynomial.com/blog/?p=25

Comme mentionné dans un article de blog ci-dessus, il existe un set de macros pour tester l'orientation. Ce blog mentionne cependant UIDeviceOrientationIsPortrait. J'aime ce qui suit en dessous, c'est une torsion mineure.

 if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) { NSLog(@"Portrait"); } else { NSLog(@"Landscape"); } 

Une observation que j'ai faite est que vous ne pouvez pas appeler ce code dans une vue de table, poussé sur un controller de navigation embedded dans le controller de vue partagée. Donc, en d'autres termes, vous ne pouvez pas l'appeler depuis le controller de la vue principale. Vous devez replace "self.interfaceOrientation" par splitviewcontroller.interfaceOrientation, en supposant que vous maintenez une reference au controller de vue divisée parent.

Utilisez plutôt l'orientation de la barre d'état pour le détecter.

UIInterfaceOrientation orientation = [UIApplication sharedApplication] .statusBarOrientation;

puis effectuez les if sur «l'orientation» que vous avez obtenue d'en haut.

La question est donc de vérifier l'orientation au démarrage. La réponse est malheureusement "Vous ne pouvez pas".

Mais APRÈS le démarrage, vous pouvez vérifier l'orientation de la manière normale (comme d'autres l'ont décrit).

Si quelqu'un d'autre vient chercher ici une réponse, arrêtez tout simplement de regarder puisque, au démarrage, la variable d'orientation n'est pas définie (toutes les images / limites des vues indiquent aussi être en portrait même si elles ne le sont pas).

Vous voulez vous assurer que vous définissez les bonnes keys dans votre Info.plist pour permettre les orientations que vous voulez:

 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight 

Pas que vous ayez besoin d'une autre réponse, mais j'ai pensé que je devrais append que vous ne voulez presque jamais utiliser l' [[UIDevice currentDevice] orientation] . Cette méthode renvoie l'orientation de l'appareil, qui n'est pas nécessairement la même que l'orientation de l'interface.

Ce n'est pas vrai que vous ne pouvez pas comprendre l'orientation de lancement, il est vrai que c'est une douleur à l'arrière pour le faire.

Voici ce que vous devez faire.

votre premier UIViewController doit avoir une logique spéciale pour récupérer les informations que vous souhaitez.
vous pourriez même vouloir créer un UIStartupController juste à ces fins si c'est important pour votre stream.
dans le cas de mon projet, nous avions déjà un tel controller de démarrage présent.

tout ce dont vous avez besoin est le code suivant

 -(id) initWithNibName:(NSSsortingng *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { self.launchOrientation = UIDeviceOrientationUnknown; } return self; } -(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; if (self.launchOrientation == UIDeviceOrientationUnknown && duration > 0) self.launchOrientation = UIInterfaceOrientationPortrait; else self.launchOrientation = toInterfaceOrientation; } 

En fait, si nous ne lançons pas dans UIInterfaceOrientationPortrait, la première séquence de callback de rotation révèlera l'orientation du lancement.
si elle est lancée dans UIInterfaceOrientationPortrait, nous devons vérifier que la durée de la première rotation est non nulle, et nous soaps qu'elle a été lancée à partir de portrait.