0

Ich habe Probleme beim Öffnen einer UINavigationController (Unterklasse) von einer Querformatansicht in eine Hochformatansicht.popViewControllerAnimated: Von Querformat zu Hochformat

Ich habe eine Kette aus der window ‚s rootViewController mit shouldAutorotate und supportedInterfaceOrientations bis hinunter zu den einzelnen View-Controller einrichten, die ich präsentieren.

Also, ich habe einen View Controller, der nur Porträt unterstützt. Der nächste, der gedrückt wird, unterstützt auch die Landschaft.

Wenn ich den einen schiebe, der Landschaft unterstützt und dann das Gerät dreht, dreht sich alles. So weit, ist es gut.

Jetzt, wenn ich zurück zum ersten, drehen beide Ansichten vor der Animation. So wird die Landschaftsansicht des zweiten ViewControllers (die wegen der Rotationstransformation wirklich klein ist) auf die rechte Seite des Portraitbildschirms verschoben.

Ich mag die Ansicht Landschaft seinen rechten (oben oder unten der Bildnisses-View-Controller) wird weggedrückt, während die Porträt-View-Controller im Hintergrund angezeigt wird.

Wie kann ich das erreichen?

Ich dachte, ich könnte versuchen, einen Animationscontroller zu verwenden, aber die Delegiertenmethode , navigationController:animationControllerForOperation: wird nicht aufgerufen, wenn Sie zu einem View Controller in einer anderen Ausrichtung.

Antwort

0

Nach Tagen des Experimentierens habe ich herausgefunden, was mein Problem war. Hoffentlich wird das jemandem in der Zukunft helfen.

Ich habe versucht, die Kette zu übersteuern.

Ich verfügte über einen benutzerdefinierten Container mit einem untergeordneten Tab-Controller, der mehrere Navigations-Controller mit View-Controllern mit unterschiedlichen Ausrichtungsanforderungen enthielt.

Mein größter Nachteil war, dass selbst wenn ein modales Fenster angezeigt würde, das System immer noch zuerst den Root-View-Controller des Fensters fragt. Zur Berücksichtigung dieser Situation habe ich einen Scheck in dem Behälter, der so aussah:

- (UIInterfaceOrientationMask)supportedInterfaceOrientations { 
    if (self.presentedViewController) { // This check is wrong! Don't do this! 
     return [self.presentedViewController supportedInterfaceOrientations]; 
    } 

    // Pass request to child view controller 
} 

Dies ist jedoch im Grunde war mein Problem auf zwei Arten verursacht.

Ohne diese Prüfung wird UIKit automatisch den Modal View Controller erkennen und direkt nach seinem supportedInterfaceOrientations fragen.

Zweitens, die Art und Weise, wie UIKit die Animationen verarbeitet, beinhaltet die Präsentation mehrerer interner Ansichts-Controller, von denen wir normalerweise nicht wissen, dass sie da sind. Durch die Überprüfung auf einen Modal View-Controller in presentingViewController wurde der Check sie abfangen und sie alle nach ihrem supportedInterfaceOrientations fragen. UIKit soll sich nicht so verhalten, also war ich derjenige, der seine Operationen störte.

Der Fix sollte supportedInterfaceOrientations implementieren, so dass es NUR die direkten Nachkommen des Ansichtscontrollers betrifft (d. H. Die View-Controller, deren view s Nachkommen in der Ansichtshierarchie des aktuellen View-Controllers sind). Die direkten Nachkommen können die Anfrage weiter von dort weiterleiten.

Behandeln Sie modale Fenster als eine völlig separate Kette, unabhängig vom Presenter.

Mit anderen Worten, vertrauen UIKit.

Verwandte Themen