I eine Viewcontroller Hierarchie (in einem Storyboard erstellt) mit den folgenden zulässigen Ausrichtungen:mit rotierenden popToRootViewController
+---------------+ +------------------+ +------------------+
+ VC1 + + VC2 + + VC3 +
+ + -> + + -> + +
+ Portrait Only + + All orientations + + All orientations +
+---------------+ +------------------+ +------------------+
Um nach der zulässigen Drehung funktioniert zu haben, um die supportedInterfaceOrientations
und shouldAutorotate
Methoden alle diesen Viewcontrollers , habe ich eine benutzerdefinierte UINavigationController
Unterklasse, mit dieser einfachen Implementierung:
public class SingleOrientationNavigationController: UINavigationController {
public override func shouldAutorotate() -> Bool {
if let topVC = topViewController {
return topVC.shouldAutorotate()
}
return false
}
public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
if let topVC = topViewController {
return topVC.supportedInterfaceOrientations()
}
return UIInterfaceOrientationMask.Portrait
}
}
Wenn die Geräte drehen, wobei das Verfahren shouldAutorotate
für die navigationCo genannt wird Controller (der der Stammcontroller meiner App ist), der den Wert des obersten View-Controllers zurückgibt. Alles geht gut, wenn ich VC2 und VC3 drücke, die sich frei drehen können.
Nun I schieben VC2 (in Porträt da VC1 nur Portrait unterstützt), drehen, um den Bildschirm (da VC2 alle Ausrichtungen unterstützt), und an den Wurzel-View-Controller Pop. Ich habe die folgende Debug-Trace:
Die supportedInterfaceOrientations
Methode für VC1 genannt wird (in den Zeilen 0 und 1), so kann das System weiß, es zu drehen, um braucht VC1 anzuzeigen richtig: Die Dreharbeiten fein.
Das Problem kommt, wenn ich versuche, von VC3 zu VC1 mit popToRootViewControllerAnimated
Pop, während VC3 im Querformat-Modus ist. Dieser Fall tritt auf, wenn die Verbindung zum Server unterbrochen wird. Daher muss ich zum Root-Ansicht-Controller zurückkehren. In diesem Fall kann ich die vorherige Ablaufverfolgung nicht erhalten, da supportedInterfaceOrientations
nicht aufgerufen wird (weder für VC1 noch VC2), und VC1 wird im Querformat angezeigt.
Wie kann ich VC1 direkt von VC3 aufrufen und in der richtigen Ausrichtung anzeigen lassen? Ich weiß, dass ich von VC3 zu VC2 dann von VC2 zu VC1 springen kann, aber ich möchte, wenn möglich, direkt von VC3 zu VC1 gehen.
Ich glaube nicht, dass es möglich ist. Die einzige Zeit, in der ich das Gefühl habe, eine Rotation erzwingen zu können, ist, wenn ich Modals verwarne, die sie nicht einmal anzeigen. Ich nehme an, wenn Sie einen Navigationscontroller über VC1 angezeigt haben und wenn Sie dann zu VC1 zurückkehren wollten, könnten Sie ihn einfach ablehnen und benutzerdefinierte Animationen erstellen, um es so aussehen zu lassen, als ob es von rechts gedrückt oder von links gedrückt wird. Aber wenn es eine Lösung gibt, die großartig wäre: 3 –