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
View-Controller 'A' (The Root-View-Controller) einen modal-View-Controller (nennen wir es 'B') mit dem "Form Blatt" modal Präsentationsstil.
View-Controller B präsentiert View-Controller 'C' mit dem modalen Darstellungsstil "Full Screen".
Das iPad wird gedreht, während der View-Controller C der am häufigsten dargestellte View-Controller ist.
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.
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