Las cosas pueden complicarse bastante cuando tiene una jerarquía de vista complicada, como tener varios controladores de navegación y / o controladores de vista de pestañas.
Esta implementación permite que los controladores de vista individuales establezcan cuándo les gustaría bloquear las orientaciones, en lugar de depender del Delegado de la aplicación para encontrarlas iterando a través de subvistas.
Rápido 3, 4, 5
En AppDelegate:
/// set orientations you want to be allowed in this property by default
var orientationLock = UIInterfaceOrientationMask.all
func application(_ application: UIApplication, supportedInterfaceOrientationsFor window: UIWindow?) -> UIInterfaceOrientationMask {
return self.orientationLock
}
En alguna otra estructura global o clase auxiliar, aquí creé AppUtility:
struct AppUtility {
static func lockOrientation(_ orientation: UIInterfaceOrientationMask) {
if let delegate = UIApplication.shared.delegate as? AppDelegate {
delegate.orientationLock = orientation
}
}
/// OPTIONAL Added method to adjust lock and rotate to the desired orientation
static func lockOrientation(_ orientation: UIInterfaceOrientationMask, andRotateTo rotateOrientation:UIInterfaceOrientation) {
self.lockOrientation(orientation)
UIDevice.current.setValue(rotateOrientation.rawValue, forKey: "orientation")
UINavigationController.attemptRotationToDeviceOrientation()
}
}
Luego, en el ViewController deseado, desea bloquear las orientaciones:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
AppUtility.lockOrientation(.portrait)
// Or to rotate and lock
// AppUtility.lockOrientation(.portrait, andRotateTo: .portrait)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
// Don't forget to reset when view is being removed
AppUtility.lockOrientation(.all)
}
Si iPad o aplicación universal
Asegúrese de que "Requiere pantalla completa" esté marcado en Configuración de destino -> General -> Información de implementación. supportedInterfaceOrientationsFor
no se llamará al delegado si no está marcado.