Tenho um aplicativo para iPhone que usa um UINavigationController
para 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 seushouldAutorotate
método. [...] O sistema determina se uma orientação é suportada pela intersecção do valor retornado pelosupportedInterfaceOrientationsForWindow:
método do aplicativo com o valor retornado pelosupportedInterfaceOrientations
método do controlador de tela inteira superior.
Então eu criei uma subclasse UINavigationController
, dei minha MainNavigationController
propriedade booleana landscapeOK
e 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 MainNavigationController
o 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 viewWillAppear
mé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?