⚠️ Orientación del dispositivo! = Orientación de la interfaz⚠️
Swift 5. * iOS14 y versiones anteriores
Realmente deberías marcar la diferencia entre:
- Orientación del dispositivo => Indica la orientación del dispositivo físico
- Orientación de la interfaz => Indica la orientación de la interfaz que se muestra en la pantalla
Hay muchos escenarios en los que esos 2 valores no coinciden, como:
- Cuando bloquea la orientación de la pantalla
- Cuando tienes tu dispositivo plano
En la mayoría de los casos, querrá usar la orientación de la interfaz y puede obtenerla a través de la ventana:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
En caso de que también desee admitir <iOS 13 (como iOS 12), debe hacer lo siguiente:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
Ahora necesita definir dónde reaccionar al cambio de orientación de la interfaz de la ventana. Hay varias formas de hacerlo, pero la solución óptima es hacerlo dentro
willTransition(to newCollection: UITraitCollection
.
Este método UIViewController heredado, que se puede anular, se activará cada vez que cambie la orientación de la interfaz. En consecuencia, puede hacer todas sus modificaciones en este último.
Aquí hay un ejemplo de solución :
class ViewController: UIViewController {
override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
super.willTransition(to: newCollection, with: coordinator)
coordinator.animate(alongsideTransition: { (context) in
guard let windowInterfaceOrientation = self.windowInterfaceOrientation else { return }
if windowInterfaceOrientation.isLandscape {
} else {
}
})
}
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
}
Al implementar este método, podrá reaccionar ante cualquier cambio de orientación de su interfaz. Pero tenga en cuenta que no se activará al abrir la aplicación, por lo que también tendrá que actualizar manualmente su interfaz en formato viewWillAppear()
.
Creé un proyecto de muestra que subraya la diferencia entre la orientación del dispositivo y la orientación de la interfaz. Además, le ayudará a comprender los diferentes comportamientos según el paso del ciclo de vida que decida actualizar su interfaz de usuario.
Siéntase libre de clonar y ejecutar el siguiente repositorio:
https://github.com/wjosset/ReactToOrientation