overAiding shouldAutorotate不在Swift 3中工作
我试图阻止一个UIViewController
上的旋转,我无法实现。
我正在做这样的事情:
open override var shouldAutorotate: Bool { get { return false } } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { get { return .portrait } }
并且UIViewControler
仍在旋转。 UIViewController位于以模态方式打开的UINavigationController中。
我从这里看了很多问题,没有一个答案适合我。
在Swift 2中,我曾经覆盖了shouldAutorotate
但在Swift 3中,该函数不再存在。
我怎么能在Swift 3中做到这一点,我曾经在Swift 2中做过什么?
如果我可以多次重现这种行为,我不知道为什么要投票来结束这个问题。 UIViewController
位于以模态方式打开的UINavigationController
。
这就是我为解决问题所做的工作。
我创建这个类,并设置为UINavigationController
,其中包含我想阻止旋转的UIViewController
class NavigationController: UINavigationController { override var shouldAutorotate: Bool { return false } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait } }
就是这样,它对我有用
将此代码添加到AppDelegate.swift
var orientationLock = UIInterfaceOrientationMask.all func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask { return self.orientationLock } 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") } }
添加到要强制方向的viewcontroller:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) //let value = UIInterfaceOrientation.landscapeLeft.rawValue //UIDevice.current.setValue(value, forKey: "orientation") AppDelegate.AppUtility.lockOrientation(.landscapeLeft) }
我发现iOS 11根本没有调用这些方法,除非我在AppDelegate
类中实现了以下UIApplicationDelegate
方法:
application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?)
对我来说,投票的答案没有用。 代替,
override open var shouldAutorotate: Bool { return false } override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { return UIApplication.shared.statusBarOrientation }
这些代码有效。 在Swift 4中证实。