⚠️Device Orientation! = Interface Orientation⚠️
Swift 5. * iOS13 e inferior
Você realmente deve fazer a diferença entre:
- Orientação do dispositivo => Indica a orientação do dispositivo físico
- Interface Orientation => Indica a orientação da interface exibida na tela
Existem muitos cenários em que esses 2 valores são incompatíveis, como:
- Quando você bloqueia a orientação da tela
- Quando você tem seu dispositivo plano
Na maioria dos casos, você deseja usar a orientação da interface e pode obtê-la por meio da janela:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
Caso você também queira oferecer suporte ao <iOS 13 (como o iOS 12), faça o seguinte:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
Agora você precisa definir onde reagir à mudança de orientação da interface da janela. Existem várias maneiras de fazer isso, mas a solução ideal é fazê-lo internamente
willTransition(to newCollection: UITraitCollection.
Este método UIViewController herdado, que pode ser sobrescrito, será acionado toda vez que a orientação da interface for alterada. Consequentemente, você pode fazer todas as modificações no último.
Aqui está um exemplo de solução :
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 {
// activate landscape changes
} else {
// activate portrait changes
}
})
}
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
}
Ao implementar este método, você será capaz de reagir a qualquer mudança de orientação de sua interface. Mas lembre-se de que ele não será acionado na abertura do aplicativo, então você também terá que atualizar manualmente sua interface no viewWillAppear().
Criei um projeto de amostra que destaca a diferença entre a orientação do dispositivo e a orientação da interface. Além disso, ajudará você a entender o comportamento diferente, dependendo de qual etapa do ciclo de vida você decide atualizar sua IU.
Sinta-se à vontade para clonar e executar o seguinte repositório:
https://github.com/wjosset/ReactToOrientation