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中证实。