Ich habe einen UIPopoverController, der einen UINavigationController hostet, der eine kleine Hierarchie von Ansichtscontrollern enthält.
Ich habe die Dokumente befolgt und für jeden Ansichts-Controller die Popover-Kontextgröße der Ansicht wie folgt festgelegt:
[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];
(Größe für jeden Controller unterschiedlich)
Dies funktioniert wie erwartet, wenn ich in der Hierarchie vorwärts navigiere. Das Popover animiert automatisch Größenänderungen, um dem Push-Controller zu entsprechen.
Wenn ich jedoch über die Schaltfläche "Zurück" der Navigationsleiste mit "Zurück" durch den Ansichtsstapel navigiere, ändert sich die Größe des Popovers nicht - es bleibt so groß wie die tiefste Ansicht, die erreicht wurde. Das scheint mir kaputt zu sein; Ich würde erwarten, dass das Popover die Größen berücksichtigt, die beim Popup durch den Ansichtsstapel eingerichtet werden.
Vermisse ich etwas
Vielen Dank.
viewWillAppear:
)?Antworten:
Ok, ich hatte mit dem gleichen Problem zu kämpfen. Keine der oben genannten Lösungen hat für mich ganz gut funktioniert. Deshalb habe ich mich entschlossen, eine kleine Untersuchung durchzuführen und herauszufinden, wie dies funktioniert. Folgendes habe ich entdeckt: - Wenn Sie das einstellen
contentSizeForViewInPopover
In Ihrem Ansichts-Controller wird es vom Popover selbst nicht geändert - auch wenn sich die Popover-Größe beim Navigieren zu einem anderen Controller ändern kann. - Wenn sich die Größe des Popovers ändert, während Sie zu einem anderen Controller navigieren, während Sie zurückkehren, wird die Größe des Popovers nicht wiederhergestellt. - Das Ändern der Größe des Popovers in viewWillAppear führt zu einer sehr seltsamen Animation (wenn Sie beispielsweise PopController im Popover verwenden) - Ich würde es nicht empfehlen - Für mich würde das Einstellen der fest codierten Größe innerhalb des Controllers überhaupt nicht funktionieren - meine Controller müssen manchmal groß sein, manchmal klein - Controller, die sie präsentieren, haben jedoch die Idee über die GrößeEine Lösung für all diese Schmerzen lautet wie folgt: Sie müssen die Größe von
currentSetSizeForPopover
in viewDidAppear zurücksetzen. Aber Sie müssen vorsichtig sein, wenn Sie die gleiche Größe einstellen, die bereits im FeldcurrentSetSizeForPopover
festgelegt wurde, ändert das Popover die Größe nicht. Dazu können Sie zunächst die falsche Größe festlegen (die sich von der zuvor festgelegten unterscheidet) und anschließend die richtige Größe festlegen. Diese Lösung funktioniert auch dann, wenn Ihr Controller im Navigationscontroller verschachtelt ist und Popover seine Größe entsprechend ändert, wenn Sie zwischen den Controllern zurück navigieren.Sie können auf UIViewController problemlos eine Kategorie mit der folgenden Hilfsmethode erstellen, mit der Sie die Größe festlegen können:
Rufen Sie es dann einfach im
-viewDidAppear
gewünschten Controller auf.quelle
So habe ich es für iOS 7 und 8 gelöst:
In iOS 8 packt iOS die gewünschte Ansicht im Popover stillschweigend in den präsentierten ViewController des präsentierenden ViewController-View-Controllers. Es gibt ein WWDC-Video von 2014, in dem erklärt wird, was mit dem Popovercontroller neu ist, wo sie dies ansprechen.
Für Ansichtscontroller, die auf dem Navigationscontrollerstapel angezeigt werden und alle ihre eigene Größe wünschen, müssen diese Ansichtscontroller (unter iOS 8) diesen Code aufrufen, um die bevorzugte Inhaltsgröße dynamisch festzulegen:
Ersetzen Sie heightOfTable durch Ihre berechnete Tabellen- oder Ansichtshöhe.
Um viel doppelten Code zu vermeiden und eine gemeinsame iOS 7- und iOS 8-Lösung zu erstellen, habe ich in UITableViewController eine Kategorie erstellt, um diese Arbeit auszuführen, wenn viewDidAppear in meinen Tabellenansichten aufgerufen wird:
Kategorie.h:
Kategorie.m:
quelle
presentingViewController
funktioniert. Wenn ich diepreferredContentSize
inviewDidLoad
ein seltsames Verhalten ist: Navigating wieder von einer anderen Ansicht - Controller in den popover führt zu einer falschen popover Größe ändern. Es scheint, als wäre eine Popover-Größe von Null festgelegt worden, aber die Größe ist korrekt. In einem solchen Fall nimmt das Popover die gesamte Bildschirmhöhe ein. Wissen Sie vielleicht, warum dies der Fall ist? Ich habe die Einschränkung mit 600 Punkten nicht implementiert, da Sie nach meiner Erfahrung mit dem Betriebssystem keine höhere Größe als die Bildschirmgröße angeben können.viewDidLoad
...Dies ist eine Verbesserung der Antwort von krasnyk .
Ihre Lösung ist großartig, aber nicht reibungslos animiert.
Eine kleine Verbesserung ergibt eine schöne Animation:
Entfernen Sie die letzte Zeile in der
- (void) forcePopoverSize
Methode:Setzen Sie [self forcePopoverSize] in die
- (void)viewWillAppear:(BOOL)animated
Methode:Und schließlich - gewünschte Größe in
- (void)viewDidAppear:(BOOL)animated
Methode einstellen :quelle
Sie müssen die Inhaltsgröße erneut einstellen
viewWillAppear
. Durch Aufrufen der Delagate-Methode, mit der Sie die Größe des Popovercontrollers festlegen. Ich hatte auch das gleiche Problem. Aber als ich das hinzufügte, löste sich das Problem.Noch etwas: Wenn Sie Beta-Versionen unter 5 verwenden, sind die Popover schwieriger zu verwalten. Ab Beta-Version 5 scheinen sie freundlicher zu sein. Es ist gut, dass die endgültige Version veröffentlicht wurde. ;)Hoffe das hilft.
quelle
viewWillAppear
mir nicht funktioniert. Das explizite Einstellen der Popover-Größe hat funktioniert, aber das ist Ghetto.In dem
-(void)viewDidLoad
von allen View - Controller Sie in der Navigation - Controller verwenden, fügt:quelle
Ich habe die Größe in der animierten Methode viewWillDisappear: (BOOL) des Ansichts-Controllers zurückgesetzt, von dem aus zurück navigiert wird:
Wenn dann die Ansicht angezeigt wird, zu der zurück navigiert wird, setze ich die Größe entsprechend zurück:
quelle
Für iOS 8 funktioniert Folgendes:
Übrigens denke ich, das sollte mit früheren iOS-Versionen kompatibel sein ...
quelle
willTransitionToTraitCollection
imanimateAlongsideTransition
Abschlussblock auf, um die Größe beim Ändern der Drehung zu korrigieren.quelle
Bei mir funktioniert diese Lösung. Dies ist eine Methode aus meinem View Controller, die UITableViewController erweitert und der Root-Controller für UINavigationController ist.
Vergessen Sie nicht, die Inhaltsgröße für den View Controller festzulegen, den Sie in den Navigationsstapel verschieben möchten
quelle
Wenn Sie sich den Assambler vorstellen können, denke ich, dass dies etwas besser ist:
quelle
CGSizeZero
stattdessen selbst zu machenCGSizeMake(0,0)
Die akzeptierte Antwort funktioniert mit iOS 8 nicht
UINavigationController
einwandfrei. Ich habe meine eigene Unterklasse für die Verwendung in diesem Popover erstellt und die Methode folgendermaßen überschriebenpreferredContentSize
:Anstatt
forcePopoverSize
(Methode von @krasnyk implementiert) in aufzurufen, habeviewDidAppear
ich mich außerdem entschlossen, einen viewController (der Popover anzeigt) als Delegaten für die zuvor erwähnte Navigation (in Popover) festzulegen und Folgendes zu tun (was Force-Methode tut) in:Methode für eine übergebene delegieren
viewController
. Eine wichtige Sache,forcePopoverSize
eineUINavigationControllerDelegate
Methode auszuführen, ist in Ordnung, wenn Sie diese Animation nicht benötigen, um glatt zu sein. Wenn ja, lassen Sie sie dann inviewDidAppear
.quelle
Ich hatte das gleiche Problem, aber Sie möchten die Inhaltsgröße nicht in der viewWillAppear- oder viewWillDisappear-Methode festlegen.
Legen Sie die contentSizeForViewInPopover-Eigenschaft für diesen Controller fest, bevor Sie diesen Controller an navigationController senden
quelle
Ich hatte Glück, indem ich Folgendes in die Ansicht eingefügt habe:
Obwohl dies in dem Fall, in dem Sie Popovers unterschiedlicher Größe drücken / knallen, möglicherweise nicht gut animiert ist. Aber in meinem Fall funktioniert perfekt!
quelle
Alles was Sie tun müssen ist:
- Fügen Sie in der viewWillAppear-Methode von popOvers contentView das unten angegebene Snippet hinzu. Sie müssen die Größe des PopOvers beim Laden beim ersten Mal angeben.
quelle
Ich hatte dieses Problem mit einem Popover-Controller, dessen popoverContentSize = CGSizeMake (320, 600) zu Beginn war, der jedoch größer wurde, wenn ich durch seinen ContentViewController (einen UINavigationController) navigierte.
Der Navigationscontroller hat nur benutzerdefinierte UITableViewController gepusht und gepoppt, daher habe ich in viewDidLoad meiner benutzerdefinierten Tabellenansicht-Controller-Klasse self.contentSizeForViewInPopover = CGSizeMake (320, 556) festgelegt.
Die 44 Pixel weniger sind für die Navigationsleiste des Nav-Controllers verantwortlich, und jetzt habe ich keine Probleme mehr.
quelle
Fügen Sie dies in alle Ansichts-Controller ein, die Sie in das Popover drücken
quelle
Das gleiche Problem wurde behoben, indem die Größe der Inhaltsansicht auf Navigationscontroller und Ansichtscontroller festgelegt wurde, bevor der Init von UIPopoverController platziert wurde.
quelle
Ich möchte nur eine andere Lösung anbieten, da keine dieser Lösungen für mich funktioniert hat ...
Ich benutze es tatsächlich mit diesem https://github.com/nicolaschengdev/WYPopoverController
Wenn Sie Ihr Popup zum ersten Mal aufrufen, verwenden Sie dies.
Verwenden Sie dies dann in diesem Popup.
Dann wiederholen Sie für untergeordnete Ansichten ...
quelle
Dies ist in iOS7 der richtige Weg, um dies zu tun. Legen Sie die bevorzugte Inhaltsgröße in viewDidLoad in jedem Ansichts-Controller im Navigationsstapel fest (nur einmal ausgeführt). Rufen Sie dann in viewWillAppear einen Verweis auf den Popover-Controller ab und aktualisieren Sie dort die contentSize.
quelle
Die @ krasnyk-Lösung funktionierte in früheren iOS-Versionen gut, in iOS8 jedoch nicht. Die folgende Lösung hat bei mir funktioniert.
Es ist nicht die beste Lösung, aber es funktioniert.
Der neue UIPopoverPresentationController hat auch das Problem der Größenänderung :(.
quelle
Sie müssen die
preferredContentSize
Eigenschaft des NavigationControllers wie folgt festlegenviewWillAppear
:quelle