Le cose possono diventare piuttosto complicate quando si ha una gerarchia di visualizzazioni complicata, come avere più controller di navigazione e / o controller di visualizzazione a schede.
Questa implementazione lo inserisce nei singoli controller di visualizzazione per impostare quando desiderano bloccare gli orientamenti, invece di fare affidamento sul delegato dell'app per trovarli iterando attraverso le visualizzazioni secondarie.
Swift 3, 4, 5
In 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
}
In qualche altra struct globale o classe helper, qui ho creato 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()
}
}
Quindi nel ViewController desiderato si desidera bloccare gli orientamenti:
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)
}
Se iPad o Universal App
Assicurati che "Richiede schermo intero" sia selezionato in Impostazioni di destinazione -> Generali -> Informazioni di distribuzione. supportedInterfaceOrientationsFor
il delegato non verrà chiamato se non è selezionato.