重写 shouldAutorotate 在 Swift 中不起作用 3

overriding shouldAutorotate not working in Swift 3

我试图阻止一个 UIViewController 的旋转,但我无法实现。

我正在做这样的事情:

open override var shouldAutorotate: Bool {
    get {
        return false
    }
}

override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
    get {
        return .portrait
    }
}

并且UIViewControler静止不动。 UIViewController 位于模态打开的 UINavigationController 中。

我从这里看了很多问题,none 答案对我有用。

在 Swift 2 中,我曾经覆盖 shouldAutorotate,但在 Swift 3 中,该功能不再存在。

我如何在 Swift 3 中执行我在 Swift 2 中执行的操作?

如果我可以多次重现此行为,我不知道为什么要投票结束问题。 UIViewController 在模态打开的 UINavigationController 中。

这就是我解决问题的方法。

我创建了这个 class 并设置为 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 class 中实现了以下 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.

中确认

iOS11,Swift5

新的秘诀是在 viewDidLoad() 中添加这个

UIDevice.current.setValue(self.preferredInterfaceOrientationForPresentation.rawValue, forKey: "orientation")

还要确保将 preferredInterfaceOrientationForPresentation 覆盖为 return 您的首选方向:

override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation { return UIInterfaceOrientation.portrait }

在这里找到答案: https://nunoalexandre.com/2018/08/24/forcing-an-orientation-in-ios

Swift 5 个答案 - 这就是你现在在 2022 年的做法

@objcMembers class YourViewController: UIViewController
{
    override var shouldAutorotate: Bool { return true }
    ...
    init() {}
    ...
 }