Les choses peuvent devenir assez compliquées lorsque vous avez une hiérarchie de vues compliquée, comme avoir plusieurs contrôleurs de navigation et / ou contrôleurs de vue par onglets.
Cette implémentation permet aux contrôleurs de vue individuels de définir quand ils souhaitent verrouiller les orientations, au lieu de compter sur le délégué d'application pour les trouver en itérant dans les sous-vues.
Swift 3, 4, 5
Dans AppDelegate:
/// set orientations you want to be allowed in this property by default
var orientationLock = UIInterfaceOrientationMask.all
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
Dans une autre structure globale ou classe d'assistance, j'ai créé ici AppUtility:
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
/// OPTIONAL Added method to adjust lock and rotate to the desired orientation
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()
}
}
Ensuite, dans le ViewController souhaité, vous souhaitez verrouiller les orientations:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AppUtility.lockOrientation(.portrait)
// Or to rotate and lock
// AppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Don't forget to reset when view is being removed
AppUtility.lockOrientation(.all)
}
Si iPad ou application universelle
Assurez-vous que "Nécessite un plein écran" est coché dans Paramètres cible -> Général -> Informations de déploiement. supportedInterfaceOrientationsFor
Le délégué ne sera pas appelé si cela n'est pas coché.