Animieren Sie popoverContentsize, wenn Sie den Navigationsansicht-Controller in popover auf dem iPad drücken
Ich habe einUIPopover
angezeigt von aUIBarButtonItem
in meiner iPad App. Es enthält aUINavigationViewController
, das eine Art Einstellungsfenster als Stammansichts-Controller hat. Das Einstellungsfenster ist eine Unterklasse vonUITableViewController
Wenn Sie auf eine der Zellen tippen, werden auf dem Nav-Controller verschiedene "Auswahl" -Ansichtscontroller verschoben, die auch Unterklassen von sindUITableViewController
.
Für jede der ausgewählten Ansichten, inviewDidAppear
Ich setzecontentSizeForViewInPopover
passend:
self.contentSizeForViewInPopover = CGSizeMake(320, self.items.count * 44);
Aber es animiert die Veränderung nicht; Wenn die Navigationsanimation beendet ist, wird das Popover auf die neue Höhe ausgerichtet (Breite ändert sich nie von 320). Rückwärtsnavigation animiert die Größenänderung (erreicht mit der Technik vondiese Antwort), aber vorwärts tut es nie.
Ich habe versucht, einen Verweis auf das Popover zu erhalten, in dem es sich befindet und das verwendet wirdsetPopoverContentSize:animated:
aber es geht nicht. Ich habe angeschautandere Fragen umsonst.
Wie kann ich die Größenänderung immer richtig animieren?
Aktualisieren: Ich habe ein einfaches Testprojekt eingerichtet, um dies auszuprobieren. Es ist eine Registerkartenanwendung für das iPad, die in Xcode eingerichtet ist. Ich habe der Navigationsleiste in einem der Ansichtscontroller einen Tab-Leisteneintrag hinzugefügt. Wenn diese Taste gedrückt wird, zeigt der Controller ein Popover mit einem sehr einfachen Navigationscontroller anUITableViewController
Unterklasse genanntTestContentViewController
, als Root-View-Controller.
ImviewDidLoad
Von dieser Unterklasse generiere ich zufällig eine Anzahl von Gegenständen:
self.numItems = arc4random() % 10 + 3;
Das ist meine Zeilenanzahl; Anzahl der Abschnitte ist 1. IncellForRowAtIndexPath
Ich habe nur den Beschriftungstext der Zelle festgelegt und ihn zurückgegeben. Wenn eine Zeile ausgewählt ist, erstelle ich eine weitere Instanz derselben Klasse und lege sie auf den Stapel.
Ohne überhaupt etwas mit dem zu tuncontentSizeForViewInPopover
Eigenschaft auf jedem VC, geht das Popover gerade zu seiner maximalen Höhe und bleibt dort, egal wieviele Reihen in meiner Tabellenansicht sind.
Wenn ich die Größe in viewDidAppear so einstelle:
-(void)viewDidAppear:(BOOL)animated
{
self.contentSizeForViewInPopover = CGSizeMake(320, self.numItems * 44);
[super viewDidAppear:animated];
{
Wenn das Popover zum ersten Mal angezeigt wird, blinkt es sehr schnell in voller Höhe und rastet dann in der von mir festgelegten Höhe ein.Wenn ein neuer Controller auf den Navigationscontroller gedrückt wird, rastet er ohne Animation auf seiner Höhe ein.Wenn ich beim Zurücknavigieren die VC, zu der ich poppe, größer ist als die, von der ich poppe, wird sie auf die richtige Größe animiert. Wenn das, worauf ich mich einlasse, kleiner ist, tut es nichts.Wenn ich das Gleiche mache, aber inviewWillAppear
:
Wenn ich das Gleiche macheviewDidLoad
Es ist im Grunde das gleiche wieviewWillAppear
außer es erscheint zuerst in der richtigen Größe.
Ich habe versucht, den Stellvertreter des Navigationscontrollers als das VC festzulegen, das das Popover darstellt, und dann die Höhe des Popovers festzulegen (setPopoverContentSize:animated:
) imnavigationController:didShowViewController:animated:
, aber die resultierende Höhe ist um ein wenig versetzt. Ich denke, die Größe, die ich dort einstelle, muss die zusätzliche Höhe der Navigationsleiste berücksichtigen, die oben im Popover eingebaut ist. Und die Animation beim Schieben eines neuen Controllers auf den Stack ist komisch.
Erneut aktualisieren: SehenHier für das gleiche problem mit dem neueren gelöstUIPopoverPresentationController
.