J'ai une application iPhone qui utilise un UINavigationController
pour présenter une interface d'exploration: d'abord une vue, puis une autre, jusqu'à quatre niveaux de profondeur. Je veux que les trois premières vues soient limitées à l'orientation portrait et que seule la dernière vue devrait pouvoir pivoter en paysage. Lorsque vous revenez de la quatrième vue à la troisième et que la quatrième vue était en orientation paysage, je veux que tout revienne en portrait.
Dans iOS 5, j'ai simplement défini shouldAutorotateToInterfaceOrientation:
dans chacun de mes contrôleurs de vue pour retourner OUI pour les orientations autorisées. Tout a fonctionné comme décrit ci-dessus, y compris le retour au portrait même si l'appareil était maintenu en orientation paysage lors du retour du contrôleur de vue n ° 4 au n ° 3.
Dans iOS 6, tous les contrôleurs de vue tournent en paysage, cassant ceux qui n'étaient pas censés le faire. Les notes de publication d'iOS 6 disent
Plus de responsabilités sont transférées à l'application et au délégué d'application. Désormais, les conteneurs iOS (tels que
UINavigationController
) ne consultent pas leurs enfants pour déterminer s'ils doivent effectuer une rotation automatique. [...] Le système demande au contrôleur de vue plein écran le plus haut (généralement le contrôleur de vue racine) pour ses orientations d'interface prises en charge chaque fois que l'appareil tourne ou chaque fois qu'un contrôleur de vue est présenté avec le style de présentation modale plein écran. De plus, les orientations prises en charge ne sont récupérées que si ce contrôleur de vue renvoie YES à partir de sashouldAutorotate
méthode. [...] Le système détermine si une orientation est prise en charge en croisant la valeur renvoyée par lasupportedInterfaceOrientationsForWindow:
méthode de l'application avec la valeur renvoyée par lasupportedInterfaceOrientations
méthode du contrôleur plein écran le plus haut.
J'ai donc sous UINavigationController
- classé , donné ma MainNavigationController
propriété booléenne landscapeOK
et utilisé ceci pour renvoyer les orientations autorisées dans supportedInterfaceOrientations
. Ensuite, dans chacune des viewWillAppear:
méthodes de mes contrôleurs de vue , j'ai une ligne comme celle-ci
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
pour me dire MainNavigationController
le comportement souhaité.
Voici la question: si je navigue maintenant vers ma quatrième vue en mode portrait et que je retourne le téléphone, il tourne en paysage. Maintenant, j'appuie sur le bouton retour pour revenir à ma troisième vue qui est censée ne fonctionner qu'en portrait. Mais ça ne revient pas. Comment faire ça?
j'ai essayé
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
dans la viewWillAppear
méthode de mon troisième contrôleur de vue, mais il ne fait rien. Est-ce la mauvaise méthode pour appeler ou peut-être le mauvais endroit pour l'appeler ou devrais-je mettre en œuvre le tout d'une manière totalement différente?