Meine iPad-Anwendung öffnet den modalen Ansicht-Controller mit dem Präsentationsstil "Seite". Wie Sie wissen, deckt der Präsentationsstil "Seite" die Statusleiste des präsentierenden View-Controllers nicht ab, um die Seitenpräsentation anzuzeigen.
Vom modalen Ansicht-Controller öffnet die App UIImagePickerController
, um ein Foto zu machen. UIImagePickerController
hat den Präsentationsstil 'Vollbild'. Nach dem Verwerfen der Bildauswahl wird der modale Ansicht-Controller um 20px größer und überlappt die Statusleiste des anfänglichen Ansicht-Controllers.
Ich habe versucht, UIImagePickerController
durch simples UINavigationController
zu ersetzen und es bricht auch meinen modalen View-Controller.
Es gibt Screenshots:
Sie können die Größe von viewController.view.superview.superview.superview.superview
frame nur wiederherstellen, nachdem Sie zum 'Page'-View-Controller zurückgekehrt sind. Aber es ist wirklich komisch.
Gibt es eine andere Möglichkeit, 'Seite' modale Ansicht Controller-Präsentation nach dem Verwerfen geschachtelten modalen Ansicht Controller zu beheben?
UPDATE: Ich benutzte solch seltsamen Code, um mein Problem zu lösen:
%Vor%Ich glaube nicht, dass es keine elegantere Lösung gibt. Irgendwelche Ideen, wie man es verbessert?
UPDATE2: Ich habe gerade einen Fehler geöffnet. Sie können es dort verfolgen: rdar: // 15949644
UPDATE3: Es gibt mein Beispielprojekt: link
Es gibt keine gute Lösung, es ist ein Apple-Bug, und bis es behoben ist, müssen Sie umgehen. Es wurde nicht in iOS 7.1 behoben. Ich arbeitete an einer Lösung und erkannte, dass ich die gleiche Lösung auch implementierte. Es ist hässlich, aber es funktioniert.
Ein Wort zu diesem Entwurf. Meine Vermutung, warum Apple dieses Problem übersehen hat, liegt daran, dass Apple einen View-Controller im Vollbildmodus nicht darstellen würde. Dies ist natürlich keine Entschuldigung, und manchmal gibt es keine andere Möglichkeit, als Vollbild zu präsentieren (wir mussten eine Kameraansicht öffnen, die zum Beispiel im Vollbildmodus geöffnet werden muss). Vielleicht können Sie Ihr Design ändern, um Apple Bugs unterzubringen.
"Stellen Sie sicher, dass der ViewController, der die modale Ansicht anzeigt, in einem NavigationController ist und diese Seltsamkeit sollte aufhören." Meine erste Antwort - falsch
Aktualisiert Das hört sich tatsächlich nach einem Bug an, obwohl man aus Sicht des User Experience keinen wirklich treffen sollte. Es scheint ein bisschen falsch zu sein, einen View-Controller im Präsentationsstil "Page" darzustellen und dann einen anderen im Vollbildmodus darüber zu präsentieren.
IMO, das ist von vornherein nur ein schlechtes Design, also ist die Tatsache, dass es sich nicht so verhält, wie man es erwartet, wahrscheinlich, weil derjenige, der es eingerichtet hat, nicht erwartet hat, dass jemand es so benutzt.
Ich würde, so wie meine ursprüngliche Antwort, wenn auch nur kurz gesagt, deinen modal präsentierten View Controller in einen Navigationscontroller einbetten und den UIImagPickerViewController hineinschieben oder seine animierte Ansicht hinzufügen, als ob sie dann wie eine andere dargestellt wird modale Ansicht. Wenn das gewünscht ist, beeinflussen Sie.
All das hört sich nicht perfekt an, eine perfektere Lösung wäre es, den Fluss Ihrer App zu betrachten und vielleicht zu bewerten, wie die Dinge dargestellt werden.
Ich denke, es ist ein Problem von iOS7, bei dem Layouts von Views leicht verändert wurden.
Ich hatte ein ähnliches Problem mit einer pop-modalen benutzerdefinierten Ansicht, wo ich das gleiche Verhalten bemerkte.
Ich habe das gelöst, indem ich diese Zeile in viewDidLoad
Vielleicht könnte es für einen Hinweis auf Ihr Problem nützlich sein.
Es gibt definitiv ein Problem mit UIImagePicker (oder allgemeiner UINavigationController), das keine Statusleisteneinstellungen in der Anwendung beachtet.
Dies wurde diskutiert und gelöst, indem Sie Ihre Statusleisteneinstellungen im UINavigationController-Delegaten erneut anwenden (siehe UIImagePickerController bricht das Erscheinen der Statusleiste ab ).
In Ihrem Fall möchten Sie vielleicht self.edgesForExtendedLayout = UIRectEdgeNone aufrufen; oder versuchen Sie, einige Statusleisteneigenschaften im Delegaten-Callback zu resetten
%Vor%