ios swift autorotate

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.