2012-05-06 4 views
7

Ich habe kürzlich ein Problem bei der Portierung von Code aus einer iPhone-App auf das iPad aufgetreten. Es könnte mit dem beschriebenen Problem in Zusammenhang stehen, here, obwohl ich die Erklärungen/Lösungen dieser Frage nicht zufriedenstellend fand. Das Szenario ist folgendes:Mehrere Presented View-Controller und Rotation auf dem iPad

  1. View-Controller 'A' (The Root-View-Controller) einen modal-View-Controller (nennen wir es 'B') mit dem "Form Blatt" modal Präsentationsstil.

  2. View-Controller B präsentiert View-Controller 'C' mit dem modalen Darstellungsstil "Full Screen".

  3. Das iPad wird gedreht, während der View-Controller C der am häufigsten dargestellte View-Controller ist.

  4. Bei Entlassung von C wird B erneut angezeigt, hat aber die falsche Ausrichtung.

Soweit ich das beurteilen kann, sollte es kein Problem mit Verkettung von mehrer präsentiert View-Controller sein - in der Tat ist dieses Verhalten explizit in der Presenting View Controllers from Other View Controllers Dokumentation unterstützt. Ich habe auch die folgende Aussage in den iOS 5 Release Notes:

Rotation Rückrufe in iOS 5 nicht sehen Controller angewandt, die über ein Vollbild dargestellt werden. Dies bedeutet, dass, wenn Ihr Code einen View-Controller über einen anderen View-Controller darstellt und der Benutzer anschließend das Gerät nach der Entlassung in eine andere Ausrichtung dreht, der zugrunde liegende Controller (d. H. Der präsentierende Controller) keine Rotations-Callbacks erhält. Beachten Sie jedoch, dass der präsentierende Controller bei der erneuten Anzeige einen Aufruf von viewWillLayoutSubviews erhält und die Eigenschaft interfaceOrientation von dieser Methode abgefragt und zum richtigen Layout des Controllers verwendet werden kann.

Soweit ich das beurteilen kann, das nicht der Fall - View-Controller-B die interfaceOrientation Parameter in diesem Aufruf um einen Anruf zu -shouldAutoRotateToInterfaceOrientation aber der Wert erhält, ist der Wert der View-Controller-Schnittstelle Ausrichtung des B, wenn es Ansicht präsentiert Controller C, nicht der Wert von Cs Schnittstellenausrichtung bei Entlassung. Da wir auf einem iPad sind, geben alle diese View-Controller YES in -shouldAutoRotateToInterfaceOrientation zurück. Daher ändern sich die Grenzen von Bs Ansicht nie, daher wird -willLayoutSubviews nie aufgerufen.

I habe versucht, die Orientierung der C-View-Controller in einem Callback-Speicher in der B vor B es entlässt, und dann diese Informationen unter Verwendung der nächste -shouldAutoRotateToInterfaceOrientation genannt wird und die Rückkehr nur JA für die Ausrichtung von C, wenn es geschlossen wird. Dies behebt die fehlerhafte Benutzeroberfläche, die ohne diese Überprüfung angezeigt wird, aber der Ansichtscontroller B aktualisiert seine Schnittstellenausrichtung nicht auf diesen Wert, sodass nachfolgende modale Präsentationen von der falschen Seite des Geräts aus animiert werden.

Hat jemand erfolgreich eine View-Controller-Konfiguration wie diese erfolgreich funktioniert? Es scheint nicht so ungewöhnlich für ein Szenario, also bin ich etwas überrascht, dass es nicht so funktioniert, wie ich es ursprünglich erwartet hatte.

Vielen Dank im Voraus.

Antwort

0

Meiner Meinung nach führen mehrfach verkettete modale View-Controller zu einer verwirrenden und nervigen Benutzererfahrung, wenn Sie keinen Navigationscontroller verwenden. Ich denke, View-Controller B sollte in einem Navigationscontroller sein (Sie müssen die Nab-Leiste nicht anzeigen, wenn Sie nicht möchten).

Die Modal-Präsentation sollte wirklich für einzelne Dead-Ender-Entitäten sein (ein einzelner View-Controller oder ein Navigations-Controller, der mehrere untergeordnete View-Controller enthält).

Aus Interesse, sagen Sie, dass dies auf dem iPhone gut funktioniert, aber nicht auf dem iPad? Oder hast du die Rotation auf der iPhone-Version nicht erlaubt?

Ich habe auch this thread gefunden, die besagt, dass die Darstellung Ihrer Modal View-Controller vom Root-View-Controller aus hilfreich sein kann.

+0

Ich stimme zu, dass es weniger verwirrend wäre, einen Navigationscontroller als Wurzel des Modals zu verwenden. Das Design, das ich versuche, zu entsprechen, erfordert jedoch den Formularstil für den Ansichtscontroller B und eine Vollbilddarstellung für den Ansichtscontroller C. Dies scheint der Weg des geringsten Widerstands zu sein, um das gewünschte Ergebnis zu erzielen, aber leider scheint es zu sein einige nicht offensichtliche Probleme.Ich bin mir nicht sicher, ob das gleiche Problem auf dem iPhone existiert - Sie sind richtig in der Annahme, dass die Rotation auf dem Telefon deaktiviert ist. – jamie

0

Ich habe an mehreren Modal-View-Controllern gearbeitet, die auf dem iPhone vorgestellt werden. Es gibt kein Problem mit dem Layout, es sei denn, es ist etwas falsch mit meinem eigenen Code für die Handhabung mehrerer Orientierungen. Auto-Rotations-Methoden werden nie aufgerufen, wenn der View-Controller hinter einem anderen View-Controller ist, also würde ich auch das Layout auf viewWillAppear anpassen: außerdem.

Auf viewWillAppear :, willRotateToInterfaceOrientation: Dauer :, und didRotateToInterfaceOrientation :, Ich würde das Layout auf die richtige Ausrichtung nach Bedarf anpassen, zum Beispiel:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self switchToInterfaceOrientation:self.interfaceOrientation]; 
} 

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    [super willRotateToInterfaceOrientation:interfaceOrientation duration:duration]; 
    [self switchToInterfaceOrientation:toInterfaceOrientation]; 
    // be careful, self.view.frame is still according to self.interfaceOrientation 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
    // self.view.frame is updated 
    // update something else here 
} 

- (void)switchToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // update your layout here 
} 

Ich bin der obige Code würde nicht sicher, wie Verhalten auf View-Controllern auf dem iPad. Da es View Controller mit verschiedenen modalen Darstellungsstilen unterstützt, kann es einige Überraschungen geben.

Verwandte Themen