Animieren Sie popoverContentsize, wenn Sie den Navigationsansicht-Controller in popover auf dem iPad drücken

Wie bringe ich meinen UIPopoverController dazu, seine Größe zu animieren, wenn sein enthaltener UINavigationController einen neuen Controller drückt?

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, inviewDidAppearIch 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 das Popover zum ersten Mal angezeigt wird, ist es in voller HöheWenn ich zum ersten Mal auf eine Zeile tippe und einen neuen Controller auf dem Stapel erhalte, wird die Animation auf ein Minimum von etwa 400 Pixel hoch. Wenn ein neuer Controller auf den Stapel geschoben wird, erhält er ihn, wenn er mehr Höhe benötigt. Wenn nicht, bleibt es bei dem, was es vorher war.

Wenn ich das Gleiche macheviewDidLoadEs 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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage