2017-03-14 1 views
2

Ich muss überprüfen, ob mein Gerät die Ausrichtung in iOS 8+ geändert hat.iOS - Falsche UIScreen-Grenzen in ViewWillTransition für iPad

Mein Ansatz ist:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransition(to: size, with: coordinator) 

    let isLand = UIScreen.main.bounds.width > UIScreen.main.bounds.height 

    coordinator.animate(alongsideTransition: nil) { _ in 
     let isLand2 = UIScreen.main.bounds.width > UIScreen.main.bounds.height 


     print("\(isLand) -> \(isLand2)") 
    } 
} 

es funktioniert in iPhone in Ordnung, aber in iPad isLand hat bereits den neuen Wert, der nach der Orientierung Abschluss sein sollte, so:

Portrait> Landschaft: true -> true

Landschaft> Porträt: false -> false

Laut der Dokumentation der Grenzen sollten sich mit der Ausrichtung ändern, also sollte es vorher/nachher Grenzen haben, oder?

UIScreen Haupt Grenzen:

Dieses Rechteck im aktuellen angegeben ist Raumkoordinate, die berücksichtigt keine Schnittstelle Drehungen in der Tat für die Vorrichtung. Daher kann sich der Wert dieser Eigenschaft ändern, wenn das Gerät zwischen Hoch- und Querformat wechselt.

Während es in Ordnung sowohl iPhone und iPad funktioniert, wenn ich die Grenzen des aktuellen Root-View-Controller wie folgt verwenden:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransition(to: size, with: coordinator) 

    let isLand = UIApplication.shared.keyWindow!.rootViewController!.view.bounds.width > UIApplication.shared.keyWindow!.rootViewController!.view.bounds.height 

    coordinator.animate(alongsideTransition: nil) { _ in 
     let isLand2 = UIApplication.shared.keyWindow!.rootViewController!.view.bounds.width > UIApplication.shared.keyWindow!.rootViewController!.view.bounds.height 


     print("\(isLand) -> \(isLand2)") 
    } 
} 

Portrait> Landschaft: false -> true

Landschaft> Porträt: true -> false

+0

Wird die viewWillTransition() -Methode vor oder nach viewDidAppear aufgerufen? – luca

Antwort

2

Sie sollten stattdessen versuchen, stattdessen containerView des Koordinatorkontexts zu verwenden.

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
    super.viewWillTransition(to: size, with: coordinator) 

    let isLand = coordinator.containerView.bounds.width > coordinator.containerView.bounds.height 

    coordinator.animate(alongsideTransition: nil) { _ in 
     let isLand2 = coordinator.containerView.bounds.width > coordinator.containerView.bounds.height 

     print("\(isLand) -> \(isLand2)") 
    } 

} 

Wenn Sie weitere Informationen in Bezug auf den Übergang erhalten können Sie die func view(forKey: UITransitionContextViewKey) und func viewController(forKey: UITransitionContextViewControllerKey) mit der .from Schlüssel verwenden.