Sytuacja może być dość skomplikowana, gdy masz skomplikowaną hierarchię widoków, na przykład wiele kontrolerów nawigacji i / lub kontrolerów widoku kart.
Ta implementacja umieszcza je na poszczególnych kontrolerach widoku, aby ustawić, kiedy chcą zablokować orientacje, zamiast polegać na delegacie aplikacji, aby znaleźć je przez iterację przez podglądy.
Swift 3, 4, 5
W AppDelegate:
var orientationLock = UIInterfaceOrientationMask.all
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
W innej globalnej klasie strukturalnej lub pomocniczej utworzyłem tutaj AppUtility:
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()
}
}
Następnie w żądanym kontrolerze ViewController, który chcesz zablokować orientacje:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AppUtility.lockOrientation(.portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
AppUtility.lockOrientation(.all)
}
Jeśli iPad lub aplikacja uniwersalna
Upewnij się, że opcja „Wymaga pełnego ekranu” jest zaznaczona w Ustawieniach celu -> Ogólne -> Informacje o wdrożeniu. supportedInterfaceOrientationsFor
delegat nie zostanie wywołany, jeśli nie jest to zaznaczone.