Tengo una aplicación en la que me gustaría admitir la rotación del dispositivo en ciertas vistas, pero otras no tienen mucho sentido en el modo horizontal, por lo que cuando cambio las vistas, me gustaría forzar la rotación para que se establezca en vertical.
Hay un establecedor de propiedades no documentado en UIDevice que hace el truco, pero obviamente genera una advertencia del compilador y podría desaparecer con una revisión futura del SDK.
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
¿Existen formas documentadas de forzar la orientación?
Actualización: pensé que proporcionaría un ejemplo ya que no estoy buscando shouldAutorotateToInterfaceOrientation ya que ya lo he implementado.
Quiero que mi aplicación admita el paisaje y el retrato en la Vista 1, pero solo el retrato en la Vista 2. Ya he implementado shouldAutorotateToInterfaceOrientation para todas las vistas, pero si el usuario está en modo horizontal en la Vista 1 y luego cambia a la Vista 2, quiero forzar la teléfono para girar de nuevo a Vertical.
fuente
Respuestas:
Esto ya no es un problema en la versión posterior del iPhone 3.1.2 SDK. Ahora parece respetar la orientación solicitada de la vista que se devuelve a la pila. Eso probablemente significa que necesitaría detectar versiones anteriores del sistema operativo iPhone y solo aplicar setOrientation cuando sea anterior a la última versión.
No está claro si el análisis estático de Apple comprenderá que está trabajando alrededor de las limitaciones del SDK anterior. Apple me ha dicho personalmente que elimine la llamada al método en mi próxima actualización, por lo que aún no estoy seguro de si tener un truco para dispositivos más antiguos pasará el proceso de aprobación.
fuente
Esto es mucho después del hecho, pero en caso de que llegue alguien que no esté usando un controlador de navegación y / o no desee usar métodos no documentados:
Es suficiente presentar y descartar un controlador de vista de vainilla.
Obviamente, aún deberá confirmar o negar la orientación en su anulación de shouldAutorotateToInterfaceOrientation. Pero esto hará que el sistema vuelva a llamar a shouldAutorotate ...
fuente
Si desea forzarlo a rotar de retrato a paisaje, aquí está el código. Solo tenga en cuenta que necesita ajustar el centro de su vista. Noté que el mío no colocaba la vista en el lugar correcto. De lo contrario, funcionó perfectamente. Gracias por el consejo.
fuente
CGAffineTransformMakeRotation
rotar la vista, pero UIAlertView sigue de acuerdo con la orientación de la barra de estado, es decir, -degreeToRadian (ángulo)? ¿Recibiste algo como esto?UIAlertView
es configurar su controlador de vista como el delegado de alertView y luego en:,- (void) didPresentAlertView:(UIAlertView *) alertView
realiza la rotación basada en el archivo[UIApplication sharedApplication].statusBarOrientation
. Si no lo anima, no debería verse demasiado extraño.Por lo que puedo decir, el
setOrientation:
método no funciona (o quizás ya no funciona). Esto es lo que estoy haciendo para hacer esto:primero, ponga esta definición en la parte superior de su archivo, justo debajo de sus #importaciones:
luego, en el
viewWillAppear:
métodosi desea que esté animado, puede envolver todo en un bloque de animación, así:
Luego, en su controlador de modo vertical, puede hacer lo contrario: verifique si está actualmente en horizontal y, de ser así, gírelo nuevamente a Vertical.
fuente
Tenía un problema en el que tenía una
UIViewController
en la pantalla, en unaUINavigationController
, en orientación horizontal. Sin embargo, cuando el siguiente controlador de vista se introduce en el flujo, necesitaba que el dispositivo volviera a la orientación vertical.Lo que noté fue que
shouldAutorotateToInterfaceOrientation:
no se llama al método cuando se inserta un nuevo controlador de vista en la pila, pero se llama cuando se extrae un controlador de vista de la pila .Aprovechando esto, estoy usando este fragmento de código en una de mis aplicaciones:
Básicamente, al crear un controlador de vista vacío, empujarlo a la pila y sacarlo inmediatamente, es posible hacer que la interfaz vuelva a la posición vertical. Una vez que se ha abierto el controlador, simplemente presiono el controlador que pretendía presionar en primer lugar. Visualmente, se ve muy bien: el usuario nunca ve el controlador de vista arbitrario y vacío.
fuente
Hay una manera simple de forzar programáticamente al iPhone a la orientación necesaria, usando dos de las respuestas ya proporcionadas por kdbdallas , Josh :
Funciona de maravilla :)
EDITAR:
para iOS 6 necesito agregar esta función: (funciona en el controlador de vista modal)
fuente
He estado investigando y explorando buscando una buena solución para esto. Encontré esta publicación de blog que hace el truco: elimine su vista más externa de la clave
UIWindow
y agréguela nuevamente, el sistema volverá a consultar losshouldAutorotateToInterfaceOrientation:
métodos de sus controladores de vista, imponiendo la orientación correcta que se aplicará. Véalo : iphone obligando a uiview a reorientarsefuente
La respuesta de Josh funciona bien para mí.
Sin embargo, prefiero publicar una notificación de "la orientación cambió, actualice la interfaz de usuario" . Cuando un controlador de vista recibe esta notificación, llama
shouldAutorotateToInterfaceOrientation:
, lo que le permite establecer cualquier orientación al regresarYES
a la orientación que desee.El único problema es que esto obliga a una reorientación sin animación. Debería envolver esta línea entre
beginAnimations:
ycommitAnimations
para lograr una transición suave.Espero que ayude.
fuente
FWIW, aquí está mi implementación de la orientación de configuración manual (para ir en el controlador de vista raíz de su aplicación, natch):
junto con el siguiente
UINavigationControllerDelegate
método (asumiendo que estás usando aUINavigationController
):Eso se encarga de rotar la vista raíz según si un entrante
UIViewController
admite la orientación actual del dispositivo. Finalmente, querrás conectarterotateInterfaceToOrientation
a los cambios reales de orientación del dispositivo para imitar la funcionalidad estándar de iOS. Agregue este controlador de eventos al mismo controlador de vista raíz:Finalmente, regístrese para
UIDeviceOrientationDidChangeNotification
recibir notificaciones eninit
o meloadview
gusta:fuente
shouldAutorotate
método (consulte stackoverflow.com/a/12586002/5171 ).Esto funciona para mí (gracias Henry Cooke):
El objetivo para mí era tratar únicamente con los cambios de orientación del paisaje.
método init:
fuente
Me doy cuenta de que la publicación original anterior en este hilo es muy antigua ahora, pero tuve un problema similar, es decir. todas las pantallas de mi aplicación son solo verticales, con la excepción de una pantalla, que el usuario puede girar entre horizontal y vertical.
Esto fue bastante sencillo, pero al igual que otras publicaciones, quería que la aplicación volviera automáticamente al retrato independientemente de la orientación actual del dispositivo, al regresar a la pantalla anterior.
La solución que implementé fue ocultar la barra de navegación en el modo horizontal, lo que significa que el usuario solo puede volver a las pantallas anteriores mientras está en modo vertical. Por lo tanto, todas las demás pantallas solo pueden estar en modo vertical.
Esto también tiene el beneficio adicional para mi aplicación de que hay más espacio de pantalla disponible en modo horizontal. Esto es útil porque la pantalla en cuestión se utiliza para mostrar archivos PDF.
Espero que esto ayude.
fuente
Resolví esto con bastante facilidad al final. Probé todas las sugerencias anteriores y aún me quedé corto, así que esta fue mi solución:
En el ViewController que debe permanecer horizontal (izquierda o derecha), escucho los cambios de orientación:
Luego en didRotate:
Tenga en cuenta cualquier Supervista / Subvista que use el tamaño automático, ya que view.bounds / frame se está restableciendo explícitamente ...
La única salvedad de este método para mantener la vista horizontal, es el cambio de animación inherente entre las orientaciones que tiene que ocurrir, cuando sería mejor que parezca que no hay cambios.
fuente
Solución iOS 6:
El código exacto depende de la aplicación y también de dónde lo coloque (lo usé en mi AppDelegate). Reemplace
[[self window] rootViewController]
con lo que usa. Estaba usando unUITabBarController
.fuente
Encontré una solución y escribí algo en francés (pero el código está en inglés). aquí
La forma es agregar el controlador a la vista de la ventana (el controlador debe poseer una buena implementación de la función shouldRotate ....).
fuente
Si está utilizando UIViewControllers, existe este método:
Regrese
NO
para los controladores de vista que contienen las vistas que no desea rotar.Más info aquí
fuente
No creo que esto sea posible en tiempo de ejecución, aunque, por supuesto, podría aplicar una transformación de 90 grados a su interfaz de usuario.
fuente
Esto es lo que utilizo. (Obtiene algunas advertencias de compilación pero funciona tanto en el Simulador como en el iPhone)
fuente