In iOS6 Probleme, ViewController auf bestimmte interfaceOrientation zu zwingen, wenn auf Stapel geschoben

8

Ich habe den folgenden View-Controller eingerichtet:

viewController1 kann sich frei in jede beliebige Ausrichtung drehen, mit Ausnahme von Porträt auf dem Kopf.

viewController2 wird über viewController1 geschoben, und ich möchte, dass es die selbe Ausrichtung hat wie viewController1 und ich möchte, dass es nicht rotieren kann.

viewController3 wird über viewController2 geschoben. Ich möchte, dass viewController3 im Hochformat ist.

Ich habe eine Menge Probleme damit, dies in iOS6 zu erreichen (habe noch nicht in iOS5 versucht). Als Erstes habe ich bereits meinen eigenen Navigations-Controller erstellt und folgendes eingefügt:

%Vor%

Ich habe viele verschiedene Kombinationen dieser Dinge ausprobiert, um Erfolg zu haben. Vor allem, wo ich Probleme habe, zwinge ich vc3 dazu, als Porträt dargestellt zu werden, wenn vc2 im Querformat ist. Jede Hilfe wäre willkommen.

    
Ser Pounce 08.03.2013, 18:28
quelle

3 Antworten

12

Was Sie hier versuchen, ist, den Rahmen zu bekämpfen. Was Sie beschreiben, ist einfach nicht, wie eine Navigations-Controller-Architektur in iOS 6 funktioniert. Wenn Sie die View-Controller-Ansicht anzeigen und die Rotation erzwingen möchten, verwenden Sie einen präsentierten View-Controller. Das ist das einzige Mal, dass preferredInterfaceOrientationForPresentation sinnvoll ist, und der supportedInterfaceOrientations des View-Controllers wird tatsächlich konsultiert, da er, wenn er präsentiert wird, die Wurzel der Schnittstelle darstellt.

    
matt 08.03.2013, 19:00
quelle
5

Ich habe in einer anderen Antwort erklärt, dass es in iOS 6 nicht unterstützt wird, force Rotation zu erzwingen, wenn ein neuer View-Controller auf einen Navigations-Controller gedrückt wird. Sie können Regeln für die kompensatorische Rotation (dh was passiert, wenn der Benutzer das Gerät dreht) strukturieren, aber Sie können die Schnittstelle nicht erzwingen drehen. Die einzige Situation, in der iOS 6 eine erzwungene Rotation zulässt, ist, wenn Sie einen View-Controller anzeigen oder ablehnen ( presentViewController:animated: und dismissViewControllerAnimated: ).

Es ist jedoch möglich, einen präsentierten View-Controller so zu verwenden, dass er aussieht , als würden Sie auf den Navigationscontroller drücken. Ich habe einen Film gemacht, der zeigt, was ich meine:

Ссылка

Nun, das ist auf keinen Fall vollkommen perfekt. Es gibt keine Rotationsanimation der Statusleiste, und es gibt eine Art schwarzes "Blinken" zwischen den beiden Ansichten - was beabsichtigt ist, weil es da ist, um zu verbergen, was wirklich ist. Was wirklich passiert, ist, dass es wirklich zwei Differenz-Navigations-Controller und drei View-Controller gibt, wie in diesem Screenshot des Storyboards gezeigt.

Was wir haben ist:

  • Eine Nav-Controller-Unterklasse, die auf Hochformat eingestellt ist, und ihr Root-View-Controller

  • eine zweite Nav-Controller-Unterklasse, die auf Querformat eingestellt ist, und ihr Root-View-Controller, der schwarz ist und als Vermittler fungiert

  • ein dritter View-Controller, der auf den Stack des zweiten Nav-Controllers geschoben wird

Wenn der Benutzer fragt, ob er vom ersten View-Controller "vorwärts" gehen soll, präsentieren wir den zweiten Navigations-Controller und sehen so den Black-View-Controller kurz, aber dann drücken wir sofort em> der dritte View-Controller. So bekommen wir eine erzwungene Rotation, zusammen mit einer Art schwarzem Blitz und einer Push-Animation. Wenn der Benutzer im dritten View-Controller auf die Schaltfläche Zurück klickt, wird der Prozess umgekehrt.

Der gesamte Übergangscode befindet sich im Black-View-Controller (ViewControllerIntermediary). Ich habe versucht, es zu optimieren, um die befriedigendste Animation zu geben, die ich kann:

%Vor%     
matt 04.05.2013 22:22
quelle
1
%Vor%

Und für Swift

%Vor%

Weitere Einzelheiten finden Sie in diesem Link

    
ZaEeM ZaFaR 19.12.2014 07:55
quelle