Попробуйте этот код ниже. Я следовал Этот урок , и он работает для меня. Что происходит:
Шаг 1. Предполагая, что внутри General
ваш Device Orientation
установлен на Portrait
только:
Шаг 2. Код ниже, который вы добавляете внутрь AppDelegate
, проходит через контроллеры навигации, а затем заглядывает внутрь своих контроллеров вида сверху. Если какой-либо из этих vcs имеет функцию с именем canRotate
, то этот конкретный vc изменит ориентацию устройства с шага 1., вернув: return .allButUpsideDown
Добавьте эти 2 функции внизу вашего AppDelegate
:
// add this first function
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
// if the navigationController's root vc has a function inside of it named canRotate
if let rootViewController = self.topViewControllerWithRootViewController(rootViewController: window?.rootViewController) {
if (rootViewController.responds(to: Selector(("canRotate")))) {
// Unlock landscape view orientations for this view controller
return .allButUpsideDown;
}
}
// Only allow portrait (standard behaviour). vcs that don't contain a function with the name "canRotate" can't rotate and stay in portrait only
return .portrait;
}
// add this second function
// loop through tabBarController or any navigationControllers
private func topViewControllerWithRootViewController(rootViewController: UIViewController!) -> UIViewController? {
if (rootViewController == nil) { return nil }
if (rootViewController.isKind(of: UITabBarController.self)) {
return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UITabBarController).selectedViewController)
} else if (rootViewController.isKind(of: UINavigationController.self)) {
return topViewControllerWithRootViewController(rootViewController: (rootViewController as! UINavigationController).visibleViewController)
} else if (rootViewController.presentedViewController != nil) {
return topViewControllerWithRootViewController(rootViewController: rootViewController.presentedViewController)
}
return rootViewController
}
Шаг 3. Внутри модального vc вы должны добавить функцию с именем: @objc func canRotate(){}
. Вам не нужно никуда звонить или добавлять что-либо внутри фигурных скобок. Код из шага 2 ищет эту функцию с именем canRotate
. Если другие vcs не содержат функции с таким именем, они не могут вращаться.
Внутри модального viewController, который вы хотите вращать, добавьте функцию canRotate () в любом месте вне viewDidLoad и внутри viewWillDisappear
добавьте код, чтобы вернуть все обратно к вашему обычному портрету:
override func viewDidLoad() {
super.viewDidLoad()
}
@objc func canRotate(){}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// add this so once leaving this vc everything will go back to Portrait only
if (self.isMovingFromParentViewController) {
UIDevice.current.setValue(Int(UIInterfaceOrientation.portrait.rawValue), forKey: "orientation")
}
}