Речі можуть стати досить сумбурними, коли у вас складна ієрархія перегляду, наприклад, наявність декількох контролерів навігації та / або контролерів перегляду вкладки.
Ця реалізація встановлює на індивідуальних контролерах подання можливість встановлювати, коли вони хочуть зафіксувати орієнтації, замість того, щоб покладатися на Делегат програми, щоб знаходити їх шляхом ітерації через підзагляди.
Стрімкий 3, 4, 5
У 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
}
У якомусь іншому глобальному класі або допоміжному класі я створив 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()
}
}
Потім у бажаному ViewController ви хочете зафіксувати орієнтацію:
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)
}
Якщо iPad або Universal App
Переконайтеся, що прапорець "Потрібен повноекранний режим" встановлений у Налаштування цілі -> Загальні -> Інформація про розгортання. supportedInterfaceOrientationsFor
делегат не буде викликаний, якщо це не позначено.