Tengo una aplicación para iPhone que usa un UINavigationController
para presentar una interfaz de desglose: primero una vista, luego otra, hasta cuatro niveles de profundidad. Quiero que las primeras tres vistas se restrinjan a la orientación vertical y solo se debe permitir que la última vista gire a horizontal. Cuando regrese de la cuarta vista a la tercera y la cuarta vista estaba en orientación horizontal, quiero que todo gire de nuevo a retrato.
En iOS 5, simplemente definí shouldAutorotateToInterfaceOrientation:
en cada uno de mis controladores de vista para devolver SÍ para las orientaciones permitidas. Todo funcionó como se describió anteriormente, incluido el regreso al retrato incluso si el dispositivo se mantenía en orientación horizontal al regresar del controlador de vista # 4 al # 3.
En iOS 6, todos los controladores de vista giran a paisaje, rompiendo aquellos que no estaban destinados a hacerlo. Las notas de la versión de iOS 6 dicen
Se está trasladando más responsabilidad a la aplicación y al delegado de la aplicación. Ahora, los contenedores de iOS (como
UINavigationController
) no consultan a sus hijos para determinar si deben rotar automáticamente. [...] El sistema solicita al controlador de vista de pantalla completa superior (generalmente el controlador de vista raíz) sus orientaciones de interfaz compatibles cada vez que el dispositivo gira o siempre que se presenta un controlador de vista con el estilo de presentación modal de pantalla completa. Además, las orientaciones admitidas se recuperan solo si este controlador de vista devuelve YES de sushouldAutorotate
método. [...] El sistema determina si una orientación es compatible mediante la intersección del valor devuelto por elsupportedInterfaceOrientationsForWindow:
método de la aplicación con el valor devuelto por elsupportedInterfaceOrientations
método del controlador de pantalla completa superior.
Así que hice una subclase UINavigationController
, le di a mi MainNavigationController
una propiedad booleana landscapeOK
y la usé para devolver las orientaciones permitidas en supportedInterfaceOrientations
. Luego, en cada uno de los viewWillAppear:
métodos de mis controladores de vista , tengo una línea como esta
[(MainNavigationController*)[self navigationController] setLandscapeOK:YES];
para decirle a mi MainNavigationController
el comportamiento deseado.
Aquí viene la pregunta: si ahora navego a mi cuarta vista en modo vertical y doy la vuelta al teléfono, gira a horizontal. Ahora presiono el botón Atrás para regresar a mi tercera vista, que se supone que funciona solo en retrato. Pero no gira hacia atrás. ¿Cómo hago para que haga eso?
Lo intenté
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait]
en el viewWillAppear
método de mi tercer controlador de vista, pero no hace nada. ¿Es este el método incorrecto para llamar o tal vez el lugar incorrecto para llamarlo o debería implementar todo de una manera totalmente diferente?