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 soit autorisée à pivoter vers le paysage. Lorsque l'on passe de la quatrième vue à la troisième et que la quatrième vue était en orientation paysage, je veux que tout revienne en orientation portrait.
Dans iOS 5, j'ai simplement défini shouldAutorotateToInterfaceOrientation:
dans chacun de mes contrôleurs de vue pour renvoyer des OUI pour les orientations autorisées. Tout a fonctionné comme décrit ci-dessus, y compris le retour au format portrait même si l'appareil était tenu 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 pivotent en mode paysage, ce qui casse ceux qui n'étaient pas censés le faire. Les notes de mise à jour d'iOS 6 indiquent
L'application et le délégué à l'application assument de plus en plus de responsabilités. Maintenant, les conteneurs iOS (tels que
UINavigationController
) ne consultent pas leurs enfants pour déterminer s'ils doivent faire une autorotation. [...] Le système demande au contrôleur de vue plein écran le plus haut placé (généralement le contrôleur de vue racine) ses orientations d'interface prises en charge chaque fois que le dispositif pivote ou qu'un contrôleur de vue est présenté avec le style de présentation modal plein écran. En outre, les orientations prises en charge ne sont récupérées que si ce contrôleur de vues renvoie un OUI de son paramètreshouldAutorotate
méthode. [...] Le système détermine si une orientation est prise en charge en croisant la valeur renvoyée par la méthode de l'applicationsupportedInterfaceOrientationsForWindow:
avec la valeur renvoyée par la méthodesupportedInterfaceOrientations
du contrôleur plein écran le plus élevé.
J'ai donc sous-classé UINavigationController
J'ai donné mon MainNavigationController
une propriété booléenne landscapeOK
et l'a utilisé pour renvoyer les orientations autorisées en supportedInterfaceOrientations
. Ensuite, dans chacun de mes contrôleurs de vue viewWillAppear:
méthodes J'ai une ligne comme ceci
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
pour dire à mon MainNavigationController
le comportement souhaité.
Voici la question : Si je me rends maintenant à ma quatrième vue en mode portrait et que je retourne le téléphone, il pivote en mode paysage. J'appuie alors sur le bouton Retour pour revenir à la troisième vue, qui est censée fonctionner en mode portrait uniquement. Mais il ne pivote pas en arrière. Comment faire pour qu'il le fasse ?
J'ai essayé
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
dans le viewWillAppear
de mon troisième contrôleur de vue, mais cela ne fait rien. S'agit-il de la mauvaise méthode à appeler ou peut-être du mauvais endroit pour l'appeler ou devrais-je mettre en œuvre l'ensemble de la chose d'une manière totalement différente ?