Drehen Sie das iPhone und instanziieren Sie einen neuen UIViewController?

7

Ich möchte Folgendes umsetzen. Wenn der Benutzer das iPhone dreht, möchte ich einen neuen UIViewController instanziieren (automatisch beim Drehen, nicht auf eine Schaltfläche klicken oder eine ähnliche Aktion ausführen) und dem Benutzer eine Ansicht anzeigen, die von diesem neuen UIViewController im Querformat gehandhabt wird. Wie man das richtig macht?

Ich habe versucht, den neuen Controller in den Methoden wtRotateToInterfaceOrientation und didRotateFromInterfaceOrientation zu instanziieren, aber keine dieser Methoden wird aufgerufen !. Ich vermute, das liegt daran, dass der aktuelle Controller von einem Navigationscontroller eingedrungen ist, der selbst von einem tabBarController bedient wird. Irgendeine Ahnung? Ein einfaches Code-Snippet würde sehr geschätzt werden.

Vielen Dank im Voraus.

    
Massimo Cafaro 08.04.2009, 16:30
quelle

4 Antworten

7

Ich habe diese genaue Art von Verhalten in einer App implementiert und der Schlüssel besteht darin, sicherzustellen, dass alle übergeordneten Controller shouldAutorotateToInterfaceOrientation implementieren und dass Ihr aktueller View-Controller diese auch implementiert. In meinem Fall verwende ich einen Tab-Controller, der den Aufruf von sentAutorotateToInterfaceOrientation abfängt, und ich musste den Tab-Controller außer Kraft setzen, damit der Anruf durchfällt. Das Standardverhalten von Ansichtscontrollern wird nur im Hochformat angezeigt.

Sie müssen sie also zwingen, alle Orientierungsänderungen zuzulassen durch:     - (BOOL) sollteAutorotateToInterfaceOrientation: (UIInterfaceOrientation) interfaceOrientation {       Rückgabe JA;     }

Um einen neuen View-Controller zu laden, sollten Sie dann antworten:

%Vor%

und kann auch verwenden:

%Vor%

Um zu erkennen, dass die Ausrichtung geändert wird.

In meinem Fall verwende ich didRotateFromInterfaceOrientation, um zu prüfen, ob die letzte Ausrichtung im Hochformat war, und falls ja, lade die Ansicht, die ich im Querformat anzeigen möchte.

Ich habe dann dieselben Methoden in den Viewcontroller implementiert, den ich lade, und er ist dafür verantwortlich, zu erkennen, wenn die Ausrichtung zurück in das Portrait wechselt und sich vom View-Stack entfernt.

Hoffe das hilft ein wenig.

Paul

    
paulthenerd 08.04.2009, 17:20
quelle
29

Ein saubererer Weg ist, UIInterfaceOrientation NICHT für die Rotation zu verwenden.

Warum, weil dann Ihre Benutzeroberfläche oder Ansicht 1 tatsächlich rotiert. Dies bedeutet, dass Sie es zurückdrehen müssen, um es wieder anzuzeigen, nachdem die Ansicht 2 entfernt wurde.

Um dies zu kompensieren, abonniere ich einfach UIDeviceOrientation Benachrichtigungen. Ganz anders. Ansicht 1 muss die Autorotation NICHT unterstützen, damit diese Methode funktioniert. Geben Sie in viewDidLoad den folgenden Code ein:

%Vor%

Dann definiere einfach die Methode detectOrientation:

%Vor%

Jetzt braucht keine Ihrer Ansichten die automatische Unterstützung! Sie müssen jedoch vor dem Laden eine Transformation in Ansicht 2 durchführen:

%Vor%

So tausche ich die Ansichten der Rotation aus, ohne die Autorotation in meinen Ansichten zu unterstützen.

    
Corey Floyd 21.05.2009 16:24
quelle
3

Tatsächlich wird nur der oberste Controller benachrichtigt. Sie sind dafür verantwortlich, verschachtelte Controller zu benachrichtigen.

Fügen Sie dies Ihrem Tab-Controller hinzu:

%Vor%     
Kornel 03.07.2009 16:19
quelle
1

Implementieren Sie shouldAutorotateToInterfaceOrientation? Wenn nicht, dann könnten Sie die Nachrichten nicht erhalten.

    
Eric Petroelje 08.04.2009 16:42
quelle

Tags und Links