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?
fuente
Agregar un CustomNavigationController
Anula estos métodos en él:
Ahora agregue todas las orientaciones en el plist
En el controlador de vista agregue solo los requeridos:
estos métodos anulan los métodos del controlador de navegación
fuente
ViewController
estén en modo Retrato y el míoViewController
en modo Paisaje y Retrato. También doy soporte tanto en iOS 5.0 como en iOS 6.0 Es por eso que estoy confuso para trabajar pero esta es una gran solución. agrego CustomNavigationController en mi controlador de vista raíz y doy soporte de acuerdo a mis necesidades. Gracias una vez más.Después de revisar cada respuesta en innumerables preguntas similares sobre SO, ninguna de las respuestas funcionó para mí, pero me dieron algunas ideas. Así es como terminé resolviendo el problema:
Primero, asegúrese de que las Orientaciones de interfaz admitidas en el objetivo de su proyecto contengan todas las orientaciones que desea para su vista giratoria.
A continuación, cree una categoría de
UINavigationController
(ya que Apple dice que no se subclasifique):Importe esa categoría y el controlador de vista que desea poder rotar (al que llamaré
RotatingViewController
) a su controlador de vista de nivel más alto, que debe contener su controlador de navegación. En ese controlador de vista, implemente de lashouldAutorotate
siguiente manera. Tenga en cuenta que este no debería ser el mismo controlador de vista que desea rotar.Finalmente, en su
RotatingViewController
, implementeshouldAutorotate
y de lasupportedInterfaceOrientations
siguiente manera:La razón por la que necesita hacer esto es porque iOS 6 le da control de rotación al controlador de vista raíz en lugar del controlador de vista superior. Si desea que la rotación de una vista individual se comporte de manera diferente a otras vistas en la pila, debe escribir un caso específico para ella en el controlador de vista raíz.
fuente
No tengo suficiente reputación para comentar la respuesta de @ Brian, así que agregaré mi nota aquí.
Brian mencionó que iOS6 le da el control de rotación al rootViewController; esto no solo podría ser un UINavigationController como se mencionó, sino también un UITabBarController, que era para mí. Mi estructura se ve así:
Así que agregué los métodos primero en un UITabBarController personalizado, luego en un UINavigationController personalizado y finalmente en el UIViewController específico.
Ejemplo de UITabBarController y UINavigationController:
fuente
Me gustaría dar una respuesta parcial a mi propia pregunta. Encontré la siguiente línea de código, utilizada en el
viewWillAppear
método de mi terceroUIViewController
, para funcionar:Pero realmente no me gusta esta solución. Utiliza un truco para asignar una propiedad de solo lectura que, según la documentación de Apple, representa la orientación física del dispositivo. Es como decirle al iPhone que salte a la orientación correcta en la mano del usuario.
Estoy muy tentado a dejar esto en mi aplicación, ya que simplemente funciona. Pero no se siente bien, así que me gustaría dejar la pregunta abierta para una solución clara.
fuente
Esto es lo que estoy usando para soporte de orientación en ios 6.0
fuente
Siendo que este es un hilo muy visto. Pensé que agregaría lo que creo que es la respuesta más fácil. Esto funciona para ios8 y posteriores
y
Eso es. ¡Disfrutar!
Ah, y mis ViewControllers están integrados en un controlador de navegación, que no necesitaba subclasificar ni configurar de ninguna manera.
fuente
Puede que esto no funcione para todos, pero funciona muy bien para mí. En lugar de implementar ...
en viewWillAppear en todos mis controladores, decidí centralizar este proceso dentro de mi subclase UINavigationController anulando el método UINavigationControllerDelegate
navigationController:willShowViewController:animated:
Descubrí que este método de delegado no se llama al sacar un VC de la pila de navegación. Esto no fue un problema para mí porque estoy manejando la funcionalidad de retroceso desde mi subclase UINavigationController para que pueda configurar los botones y acciones de la barra de navegación adecuados para VC específicos como este ...
Así es
back
como se ve mi método para manejar la extracción del VC de la pila y establecer la preferencia de rotación adecuada ...Entonces, como puede ver, básicamente todo lo que está sucediendo es que primero me estoy configurando dos propiedades ...
en el
navigationController:willShowViewController:animated:
cual se determinarán cuáles son las orientaciones soportadas dentro de esa CV que está a punto de ser presentada. Al abrir un VC, se llama a mi método personalizado "back" y luego estoy configurando isLandscapeOK a lo que se almacenó a través del valor VCLandscapeOK anterior.Como dije, esto puede no funcionar para todos, pero funciona muy bien para mí y no tengo que preocuparme por agregar código a cada uno de mis controladores de vista, pude mantenerlo todo centralizado en la subclase UINavigationController.
Espero que esto ayude a alguien como a mí. Gracias Jeremy.
fuente
Vaya a su archivo Info.plist y realice el cambio
fuente
Solo desea Forzar el retrato de la aplicación iOS 6 y luego puede agregar a una subclase de UIViewController a continuación los métodos
fuente
NSUInteger
arroja una advertencia a pesar de ser el tipo var correcto. si tiene TOC, useUIInterfaceOrientationMask
en su lugar.Quería tener todos mis VC bloqueados en orientación vertical excepto uno. Esto es lo que funcionó para mí.
En el controlador de vista raíz, detecte el tipo de controlador de vista que está en la parte superior de la ventana y establezca la orientación de la aplicación en consecuencia en el método supportedInterfaceOrientations . Por ejemplo, necesitaba que mi aplicación girara solo cuando la vista web estaba en la parte superior de la pila. Esto es lo que agregué en mi rootVC:
fuente
[[Utils getAppDelegate] appNavigationController]
. Utils Supongo que es una clase que tienes, pero no sé qué haces en ella. ¡Cualquier ayuda sería genial!No tengo suficiente reputación para responder la pregunta de @Ram S en la respuesta de @micmdk, así que agregaré mi nota aquí.
Cuando use UITabbarController , intente cambiar self.viewControllers.lastObject en el código de @ micmdk a self.selectedViewController así:
fuente
Puede implementar y anular shouldAutorotate () y supportedInterfaceOrientations var en todas sus clases de View Controller que deben presentarse en orientaciones diferentes a las definidas en PLIST de su aplicación.
Sin embargo, en una interfaz de usuario no trivial, es posible que tenga un problema para agregarlo en docenas de clases y no desea que todas sean subclase de varios comunes que lo admiten (MyBaseTableViewController, MyBaseNavigationController y MyBaseTabBarController).
Dado que no puede anular esos métodos / var en UIViewController directamente, puede hacerlo en sus subclases que generalmente son clases base suyas como UITableViewController, UINavigationController y UITabBarController.
Por lo tanto, puede implementar algunas extensiones y aún configurar MyPreciousViewController para que se muestre en orientaciones diferentes a todas las demás, como este fragmento de código Swift 4:
fuente
He resuelto el mismo tipo de problema.
Si está utilizando
UINavigationController
para empujar los controladores de vista, debe configurar los métodos a continuación.En el lugar de
LoginViewController
uso queUIViewController
desea mostrar. En mi caso, quiero mostrar elLoginViewController
en elPortrait
modo otroViewControllers
en ellandscape
modo.fuente
Utilice el siguiente método para resolver este problema
devuelve solo la orientación que quieras !!!
fuente