¿Puede alguien decirme cuál es el enfoque "correcto" o el "mejor" para trabajar con orientaciones de interfaz vertical y horizontal en iOS 8? Parece que todas las funciones que quiero usar para ese propósito están obsoletas en iOS 8, y mi investigación no ha encontrado una alternativa clara y elegante. ¿De verdad se supone que debo mirar el ancho y la altura para determinar por mí mismo si estamos en modo retrato o paisaje?
Por ejemplo, en mi controlador de vista, ¿cómo debo implementar el siguiente pseudocódigo?
if we are rotating from portrait to landscape then
do portrait things
else if we are rotating from landscape to portrait then
do landscape things
UIViewController
. Consulte la sección titulada "Manejo de rotaciones de vista". Explica lo que debe hacer.Respuestas:
Apple recomienda usar clases de tamaño como una medida aproximada de cuánto espacio de pantalla está disponible, para que su interfaz de usuario pueda cambiar significativamente su diseño y apariencia. Tenga en cuenta que un iPad en vertical tiene las mismas clases de tamaño que en horizontal (ancho normal, alto normal). Esto significa que su interfaz de usuario debería ser más o menos similar entre las dos orientaciones.
Sin embargo, el cambio de retrato a paisaje en un iPad es lo suficientemente significativo como para que deba realizar algunos ajustes más pequeños en la interfaz de usuario, aunque las clases de tamaño no hayan cambiado. Dado que los métodos relacionados con la orientación de la interfaz
UIViewController
han quedado obsoletos, Apple ahora recomienda implementar el siguiente método nuevoUIViewController
como reemplazo:¡Excelente! Ahora está recibiendo devoluciones de llamada justo antes de que comience la rotación y después de que finalice. Pero, ¿qué hay de saber realmente si la rotación es vertical o horizontal?
Apple recomienda pensar en la rotación como simplemente un cambio en el tamaño de la vista principal. En otras palabras, durante una rotación del iPad de vertical a horizontal, puede pensar en ella como la vista de nivel de raíz simplemente cambiando
bounds.size
de{768, 1024}
a{1024, 768}
. Sabiendo esto, entonces, se debe utilizar elsize
pasado alviewWillTransitionToSize:withTransitionCoordinator:
método anterior para averiguar si se está girando a vertical u horizontal.Si desea una forma aún más fluida de migrar el código heredado a la nueva forma de hacer las cosas de iOS 8, considere usar esta categoría simple en UIView, que se puede usar para determinar si una vista es "vertical" o "horizontal" según su Talla.
Recordar:
viewWillTransitionToSize:withTransitionCoordinator:
devolución de llamada en UIViewController.statusBarOrientation
, que es básicamente una propiedad a nivel de dispositivo, para determinar si se debe diseñar una vista para "retrato" o "paisaje". La orientación de la barra de estado solo debe ser utilizada por el código que se ocupa de cosas como lasUIWindow
que realmente viven en el nivel raíz de la aplicación.fuente
UIViewControllerTransitionCoordinator
es una pesadilla :-(viewdidlayoutsubviews
entonces? Pensé queviewdidlayoutsubviews
se usa para capturar cambios vinculados debido a la rotación. ¿Puedes dar más detalles sobre eso?Basado en la respuesta muy bien detallada (y aceptada) de smileyborg, aquí hay una adaptación usando Swift 3:
Y en la
UICollectionViewDelegateFlowLayout
implementación,fuente
Simplemente uso el Centro de notificaciones:
Agregue una variable de orientación (se explicará al final)
Agregar notificación cuando aparezca la vista
Eliminar notificación cuando la vista desaparece
Obtiene la orientación actual cuando se activa la notificación
Comprueba la orientación (retrato / paisaje) y gestiona los eventos.
La razón por la que agrego una variable de orientación es porque al probar en un dispositivo físico, la notificación de orientación se llama en cada movimiento menor en el dispositivo, y no solo cuando gira. Agregar las declaraciones var y if solo llama al código si cambia a la orientación opuesta.
fuente
super
deviewDidAppear
yviewWillDisappear
debería llamarseDesde la perspectiva de la interfaz de usuario, creo que el uso de clases de tamaño es el enfoque recomendado por Apple para manejar interfaces en diferentes orientaciones, tamaños y escalas.
Consulte la sección: Los rasgos describen la clase de tamaño y la escala de una interfaz aquí: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html
Este también es un buen artículo: https://carpeaqua.com/thinking-in-terms-of-ios-8-size-classes/
EDITAR Enlace actualizado: https://carpeaqua.com/2014/06/14/thinking-in-terms-of-ios-8-size-classes/ (Crédito: Koen)
fuente