Tenho um aplicativo para iPhone que usa um UINavigationControllerpara apresentar uma interface detalhada: primeiro uma visualização, depois outra, até quatro níveis de profundidade. Quero as três primeiras visualizações restritas à orientação retrato e somente a última visualização deve ser permitida a girar para paisagem. Ao retornar da quarta visualização para a terceira e a quarta visualização estava na orientação paisagem, quero que tudo gire de volta para o retrato.
No iOS 5, eu simplesmente defini shouldAutorotateToInterfaceOrientation:em cada um dos meus controladores de visualização para retornar SIM para as orientações permitidas. Tudo funcionou conforme descrito acima, incluindo o retorno ao retrato, mesmo se o dispositivo estivesse sendo mantido na orientação paisagem ao retornar do controlador de visualização nº 4 para o nº 3.
No iOS 6, todos os controladores de visualização giram para paisagem, interrompendo aqueles que não foram feitos para isso. As notas de lançamento do iOS 6 dizem
Mais responsabilidade é passar para o aplicativo e o delegado do aplicativo. Agora, os contêineres iOS (como
UINavigationController) não consultam seus filhos para determinar se eles devem girar automaticamente. [...] O sistema pergunta ao controlador de exibição de tela inteira superior (normalmente o controlador de exibição raiz) para as orientações de interface suportadas sempre que o dispositivo gira ou sempre que um controlador de exibição é apresentado com o estilo de apresentação modal de tela inteira. Além disso, as orientações suportadas são recuperadas apenas se este controlador de visualização retornar YES de seushouldAutorotatemétodo. [...] O sistema determina se uma orientação é suportada pela intersecção do valor retornado pelosupportedInterfaceOrientationsForWindow:método do aplicativo com o valor retornado pelosupportedInterfaceOrientationsmétodo do controlador de tela inteira superior.
Então eu criei uma subclasse UINavigationController, dei minha MainNavigationControllerpropriedade booleana landscapeOKe usei isso para retornar as orientações permitidas em supportedInterfaceOrientations. Então, em cada um dos viewWillAppear:métodos dos meus controladores de visualização, eu tenho uma linha como esta
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
para dizer ao meu MainNavigationControllero comportamento desejado.
Aí vem a pergunta: se eu agora navegar para a minha quarta visualização no modo retrato e virar o telefone, ele gira para a paisagem. Agora, pressiono o botão Voltar para retornar à minha terceira visualização, que deve funcionar apenas como retrato. Mas não gira de volta. Como faço isso?
eu tentei
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
no viewWillAppearmétodo do meu terceiro controlador de visualização, mas não faz nada. Este é o método errado para chamar ou talvez o lugar errado para chamá-lo ou devo implementar tudo de uma maneira totalmente diferente?


