重写 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() {}
...
}
我试图阻止一个 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() {}
...
}