ios - anulando debeAutorotate no funciona en Swift 3
(4)
Estoy tratando de evitar la rotación en un UIViewController
y no puedo lograrlo.
Estoy haciendo algo como esto:
open override var shouldAutorotate: Bool {
get {
return false
}
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
get {
return .portrait
}
}
Y el UIViewControler
girando. El UIViewController está dentro de un UINavigationController abierto modalmente.
He mirado muchas preguntas desde aquí y ninguna de las respuestas funciona para mí.
En Swift 2 solía anular la shouldAutorotate
pero en Swift 3 esa función ya no existe.
¿Cómo puedo hacer eso en Swift 3 que solía hacer en Swift 2?
Agregue este código a 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")
}
}
Agregue al controlador de vista que desea forzar una orientación:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
//let value = UIInterfaceOrientation.landscapeLeft.rawValue
//UIDevice.current.setValue(value, forKey: "orientation")
AppDelegate.AppUtility.lockOrientation(.landscapeLeft)
}
Descubrí que iOS 11 no estaba llamando a estos métodos en absoluto a menos que hubiera implementado el siguiente método UIApplicationDelegate
en mi clase AppDelegate
:
application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?)
No sé por qué es un voto para cerrar la pregunta si puedo reproducir este comportamiento muchas veces. El UIViewController
está dentro de un UINavigationController
abierto UINavigationController
.
Esto es lo que hice para resolver el problema.
Creo esta clase y configuro el UINavigationController
que UIViewController
el UIViewController
que quiero evitar que gire
class NavigationController: UINavigationController {
override var shouldAutorotate: Bool {
return false
}
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .portrait
}
}
Y eso es todo, funciona para mí.
Para mí, la respuesta votada no funcionó. En lugar,
override open var shouldAutorotate: Bool {
return false
}
override open var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
return UIApplication.shared.statusBarOrientation
}
Esos códigos funcionan. Confirmado en Swift 4.