Estoy usando Swift y quiero poder cargar un UIViewController cuando giro a horizontal, ¿alguien puede señalarme en la dirección correcta?
No puedo encontrar nada en línea y la documentación me confunde un poco.
ios
swift
orientation-changes
David
fuente
fuente
Respuestas:
Así es como lo hice funcionar:
En
AppDelegate.swift
el interior de ladidFinishLaunchingWithOptions
función pongo:y luego dentro de la clase AppDelegate pongo la siguiente función:
Espero que esto ayude a alguien más!
¡Gracias!
fuente
selector
tener un formato de cadena de"rotated:"
??rotated()
no lo hace)UIDeviceOrientation
es algo diferente aUIInterfaceOrientation
... EstoUIDeviceOrientation
también se debe a que detecta las orientaciones boca abajo y boca arriba, lo que significa que su código puede saltar aleatoriamente entre retrato y paisaje si su dispositivo descansa sobre una superficie casi plana pero ligeramente irregular (es decir, balanceándose sobre el saliente cámara de los 6 / 6s)fuente
Necesito detectar la rotación mientras uso la cámara
AVFoundation
y descubrí que los métodosdidRotate
( ahora obsoletos )willTransition
no eran confiables para mis necesidades. El uso de la notificación publicada por David funcionó, pero no está actualizado para Swift 3.x / 4.x.Swift 4.2 El nombre de la notificación ha sido cambiado.
El valor de cierre sigue siendo el mismo que Swift 4.0:
Para configurar la notificación para Swift 4.2 :
Para eliminar la notificación de Swift 4.2 :
Con respecto a la declaración de desaprobación , mi comentario inicial fue engañoso, por lo que quería actualizar eso. Como se señaló, el uso de la
@objc
inferencia ha quedado en desuso, lo que a su vez era necesario para usar a#selector
. Al usar un cierre, esto se puede evitar y ahora tiene una solución que debería evitar un bloqueo debido a llamar a un selector no válido.Todo lo que se muestra a continuación es obsoleto a partir de XCode 10 y iOS 4.2
Swift 4.0 Con Swift 4.0, Apple nos ha alentado a evitar el uso de
#selector
, por lo que este enfoque utiliza un bloque de finalización ahora. Este enfoque también es retrocompatible con Swift 3.xy sería el enfoque recomendado en el futuro.Esta es la advertencia del compilador que recibirá en un proyecto Swift 4.x si usa la
#selector
función debido a la depreciación de la@objc
inferencia:Entrada en rápida evolución en este cambio .
Configurar la devolución de llamada:
Configurar la notificación:
Romper en pedazos:
fuente
El uso de la
-orientation
propiedad deUIDevice
no es correcto (incluso si podría funcionar en la mayoría de los casos) y podría provocar algunos errores, por ejemplo,UIDeviceOrientation
considere también la orientación del dispositivo si está boca arriba o hacia abajo, no hay par directo en laUIInterfaceOrientation
enumeración para aquellos valores.Además, si bloquea su aplicación en alguna orientación particular, UIDevice le dará la orientación del dispositivo sin tenerlo en cuenta.
Por otro lado, iOS8 ha dejado de usar la
interfaceOrientation
propiedad enUIViewController
clase.Hay 2 opciones disponibles para detectar la orientación de la interfaz:
Lo que aún falta es una forma de entender la dirección de un cambio de orientación de la interfaz, que es muy importante durante las animaciones.
En la sesión de WWDC 2014 "Ver avance del controlador en iOS8", el orador también proporciona una solución a ese problema, utilizando el método que reemplaza
-will/DidRotateToInterfaceOrientation
.Aquí la solución propuesta parcialmente implementada, más información aquí :
fuente
Sé que esta pregunta es para
Swift
, pero dado que es uno de los principales enlaces para una búsqueda en Google y si está buscando el mismo código enObjective-C
:fuente
Fácil, esto funciona en iOS8 y 9 / Swift 2 / Xcode7, solo ponga este código dentro de su viewcontroller.swift. Imprimirá las dimensiones de la pantalla con cada cambio de orientación, puede poner su propio código en su lugar:
fuente
didRotateFromInterfaceOrientation()
no funciona de manera confiable. Se echa de menos algunas rotaciones.iewWillTransitionToSize:withTransitionCoordinator:
funciona bienUse la nueva viewWillTransitionToSize (_: withTransitionCoordinator :)
fuente
Me gusta verificar la notificación de orientación porque puede agregar esta función en cualquier clase, no es necesario que sea una vista o un controlador de vista. Incluso en su delegado de aplicaciones.
SWIFT 5:
que almacenar en caché la notificación
fuente
En el objetivo C
En rápido
Anule este método para detectar el cambio de orientación.
fuente
Swift 3 | UIDeviceOrientationDidChange Notificación observada con demasiada frecuencia
El siguiente código imprime "deviceDidRotate" cada vez que su dispositivo cambia de orientación en el espacio 3D, independientemente de un cambio de orientación vertical a horizontal. Por ejemplo, si sostiene su teléfono en orientación vertical y lo inclina hacia adelante y hacia atrás, se llama repetidamente deviceDidRotate ().
Para evitar esto, puede mantener la orientación anterior del dispositivo y verificar si hay un cambio en deviceDidRotate ().
O puede usar una notificación diferente que solo se llama cuando el dispositivo cambia de horizontal a vertical. En este caso, querrás usar la
UIApplicationDidChangeStatusBarOrientation
notificación.fuente
Implementación funcional completa de cómo detectar cambios de orientación en Swift 3.0.
Elegí usar esta implementación porque las orientaciones telefónicas
face up
yface down
eran importantes para mí, y quería que la vista cambiara solo una vez que supiera que la orientación estaba en la posición especificada.Las piezas importantes a tener en cuenta son:
unknown
a veces hay una orientación.Espero que alguien encuentre esto útil.
fuente
fuente
Si desea hacer algo DESPUÉS de que se complete la rotación, puede usar el
UIViewControllerTransitionCoordinator
controlador de finalización de esta manerafuente
Desde iOS 8, esta es la forma correcta de hacerlo.
fuente
Verifique si la rotación ha cambiado con:
viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator)
Con el
coordinator.animateAlongsideTransition(nil) { (UIViewControllerTransitionCoordinatorContext)
puede verificar si la transición ha finalizado.Ver código a continuación:
fuente
Aquí hay una manera fácil de detectar la orientación del dispositivo: ( Swift 3 )
fuente
willRotate
ahora está en desuso, mejor usoviewWillTransition
.Swift 4:
Muchas respuestas no ayudan cuando se necesita detectar en varios controladores de vista. Este hace el truco.
fuente
viewWillDisappear
y añadiraddObserver
enviewDidLoad
. iOS cancela la vista del controlador de vista automáticamente.UIDevice.current.orientation.isFlat
Mi enfoque es similar a lo que muestra bpedit arriba, pero con un enfoque iOS 9+. Quería cambiar el alcance del FSCalendar cuando la vista gira.
Esto funcionó a continuación, pero me sentí avergonzado al respecto :)
fuente
Yo uso
UIUserInterfaceSizeClass
para detectar una orientación cambiada en unaUIViewController
clase así:fuente
Para Swift 3
fuente
UIDevice.current.orientation.isFlat
Swift 5
Configure la clase para recibir notificaciones de cambio de orientación del dispositivo:
Código del controlador de configuración:
fuente
NOTA: Simplemente use este código para identificar que UIViewController está en qué orientación
fuente
fuente
Con iOS 13.1.2, la orientación siempre devuelve 0 hasta que se gira el dispositivo. Necesito llamar a UIDevice.current.beginGeneratingDeviceOrientationNotifications () para obtener la rotación real antes de que ocurra cualquier evento de rotación.
fuente