⚠️ Orientation de l'appareil! = Orientation de l'interface⚠️
Swift 5. * iOS13 et inférieur
Vous devriez vraiment faire la différence entre:
- Orientation de l'appareil => Indique l'orientation de l'appareil physique
- Orientation de l'interface => Indique l'orientation de l'interface affichée à l'écran
Il existe de nombreux scénarios dans lesquels ces 2 valeurs ne correspondent pas, par exemple:
- Lorsque vous verrouillez l'orientation de votre écran
- Lorsque votre appareil est à plat
Dans la plupart des cas, vous voudrez utiliser l'orientation de l'interface et vous pouvez l'obtenir via la fenêtre:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
}
Si vous souhaitez également prendre en charge <iOS 13 (comme iOS 12), procédez comme suit:
private var windowInterfaceOrientation: UIInterfaceOrientation? {
if #available(iOS 13.0, *) {
return UIApplication.shared.windows.first?.windowScene?.interfaceOrientation
} else {
return UIApplication.shared.statusBarOrientation
}
}
Vous devez maintenant définir où réagir au changement d'orientation de l'interface de la fenêtre. Il existe plusieurs façons de le faire, mais la solution optimale est de le faire à l'intérieur
willTransition(to newCollection: UITraitCollection
.
Cette méthode UIViewController héritée qui peut être remplacée sera déclenchée chaque fois que l'orientation de l'interface sera modifiée. Par conséquent, vous pouvez effectuer toutes vos modifications dans ce dernier.
Voici un exemple de solution :
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
}
}
En implémentant cette méthode, vous serez alors en mesure de réagir à tout changement d'orientation de votre interface. Mais gardez à l'esprit qu'il ne sera pas déclenché à l'ouverture de l'application, vous devrez donc également mettre à jour manuellement votre interface dans viewWillAppear()
.
J'ai créé un exemple de projet qui souligne la différence entre l'orientation de l'appareil et l'orientation de l'interface. En outre, cela vous aidera à comprendre les différents comportements en fonction de l'étape du cycle de vie que vous décidez de mettre à jour votre interface utilisateur.
N'hésitez pas à cloner et exécuter le référentiel suivant:
https://github.com/wjosset/ReactToOrientation