2016-04-14 8 views
0

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:

enter image description here

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.

+0

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 –

Antwort

0

Ich bin neu auf Stack und ich hoffe, es ist nicht zu spät, um die Frage zu beantworten, aber ich bin in der gleichen Situation wie der Autor. Stellen Sie sich vor, Sie haben ein VC4 nur im Hochformat und wenn Sie versuchen, es von VC3 (Landschaft) zu schieben, wird Ihr VC4 auch im Querformat angezeigt. Es sieht aus wie die supportedInterfaceOrientations Funktion aufrufen, ist nicht ...

Ihr Problem zu lösen VC3 => VC1 fand ich ein „Hack“ https://stackoverflow.com/a/15057537/6257992 (ich benutze das IOS 7-Methode)

Ich habe die gleiche Umsetzung wie Sie .

  1. eine BlankViewController erstellen, die die zwei Methoden in den benutzerdefinierten definiert überschreibt Navigation
  2. Fügen Sie den Code in dem Link zu Ihrer ViewWillAppear von VC1 und ersetzen Sie die UIViewController durch den freien Raum eines Für eine „anständige“ Animation:

    • PopToRootViewController = true
    • PresentViewController = false
    • DismissViewController = t rue

PS: die Animation auf einem Telefon sieht besser aus als im Simulator.

Wenn Sie einen besseren Weg finden oder irgendwelche Anmerkungen haben, teilen Sie bitte.

Verwandte Themen