Wenn Sie eine komplizierte Ansichtshierarchie haben, wie z. B. mehrere Navigationscontroller und / oder Registerkartenansicht-Controller, kann es ziemlich chaotisch werden.
Bei dieser Implementierung müssen die einzelnen Ansichtscontroller festlegen, wann sie Ausrichtungen sperren möchten, anstatt sich darauf zu verlassen, dass der App-Delegierte sie durch Durchlaufen von Unteransichten findet.
Schnelle 3 & 4
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 einer anderen globalen Struktur- oder Hilfsklasse habe ich hier AppUtility erstellt:
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()
}
}
Dann möchten Sie im gewünschten ViewController die Ausrichtung sperren:
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)
}
Wenn iPad oder Universal App
Stellen Sie sicher, dass unter Zieleinstellungen -> Allgemein -> Bereitstellungsinformationen die Option "Vollbild erforderlich" aktiviert ist. supportedInterfaceOrientationsFor
Der Delegat wird nicht angerufen, wenn dies nicht aktiviert ist.