2010-05-28 3 views
16

Ich habe einen UIPopoverController mit einer Unterklasse UINavigationController. Sowohl die Eltern- als auch die Kindansicht sind UITableviews.UIPopoverController mit UINavigationController Subview contentSizeForViewInPopover funktioniert nicht im Parent

Wenn ich die Elternansicht ursprünglich mit contentSizeForViewInPopover = (320,480) aufrufen, funktioniert es großartig.

Wenn ich das Kind Ansicht klicken I in die popover zu contentSizeForViewInPopover = (320.780) die Größe i kann auf der übergeordneten Ansicht

Wenn Rückkehr wieder nicht die popover zurück zu contentSizeForViewInPopover = (320.480) zu ändern. Das Popover bleibt bei der Größe (320.780).

Ich habe alles versucht, aber nur etwas vermisst. Weiß jemand, wie man die Ansicht mit UIPopoverControllern im obigen Szenario ändert?

Vielen Dank im Voraus!

+0

jemand? Ich konnte mein Popover immer noch nicht richtig skalieren. es ist einfach, in der Größe zu vergrößern, aber ich kann es nicht bekommen, zu der kleineren ursprünglichen Größe zurückzukehren. – Abbacore

+0

Gute Tagging ist der Weg, um Ihre Frage beantwortet zu bekommen :) – skaffman

Antwort

13

Ich hatte das gleiche Problem, aber keine der oben genannten Lösungen funktionierte für mich. Beim Versuch, ihre Ansätze zu kombinieren, wurde ich jedoch inspiriert, eine etwas andere Art und Weise zu versuchen, das Problem anzugehen. Dies funktioniert für mich:

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    viewController.contentSizeForViewInPopover = navigationController.topViewController.view.frame.size; 
} 

Ich habe drei verschiedene Popovers, die jeweils Navigationsansicht Controller verwenden. Diese Lösung hat den schönen Nebeneffekt, dass sie für alle von ihnen funktioniert, da sie keinen spezifischen Bezug zu einem der Popover-Controller herstellt, sondern am Ende den popoverContentSize des aktuell verwendeten Popover-Controllers verwendet.

+0

Nachdem ich alle Methoden in diesem Thread und von anderen Orten aus getestet habe, war dies die einzige Möglichkeit für mich, das zu schaffen. Vielen Dank. –

+0

Ich fand dies in der Dokumentation: "Diese Eigenschaft enthält die gewünschte Größe für den View-Controller, wenn es in einem Popover angezeigt wird. Standardmäßig ist die Breite auf 320 Punkte und die Höhe auf 1100 Punkte festgelegt." Also, wenn Sie setze das contentSizeForViewInPopover NICHT explizit, es wird 320x1100 sein, das hat mich verrückt gemacht, weil ich dachte, Apple würde vernünftige Standardwerte verwenden und contentSizeForViewInPopover standardmäßig auf den Frame der Ansicht setzen oder so etwas, aber das ist offensichtlich nicht der Fall. Setze also contentSizeForViewinPopover, wenn du möchtest, dass sich dein Popover verhält! – mgrandi

+0

Das funktionierte auch für mich, aber ich habe keine Ahnung warum. Sizing Popovers scheint abgehört. Manchmal werden sie die Größe richtig ändern, manchmal müssen Sie eine seltsame Reihe von Methoden festlegen, nur um es richtig funktionieren zu lassen. – LightningStryk

1

Ich denke, ich hatte das gleiche Problem und löste es, indem ich die Größe für die Ansicht im Popover jedes Mal einstellte, wenn die Ansicht erscheinen sollte. Gefällt mir:

 

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 

    self.contentSizeForViewInPopover = CGSizeMake(320, 444); //Set your own size 
} 

Ich hoffe das hilft dir.

+0

danke für die Eingabe Enrigue. Ursprünglich habe ich das versucht und scheint einfach nichts zu tun. Stellen Sie sich vor, das Eltern-Popover öffnet sich bei 320x480. Dann wähle ich eine Zeile, die eine "Kind" -Ansicht in das Popover von 320x720 drückt. Wenn ich auf den Zurück-Button klicke, ist meine "Eltern" -Ansicht immer noch 320x720. – Abbacore

+0

Können Sie erkennen, wenn sie die Zurück-Taste drücken oder wenn die vorherige Ansicht nach dem Berühren der Zurück-Taste erneut angezeigt wird? Wenn Sie das erkennen können, können Sie den 'contentSizeForViewInPopover' in diesen Teil des Codes einfügen. –

24

Die contentSizeForViewInPopover -Eigenschaft des Ansichtscontrollers legt nur die Standardgröße (initial) des Containers UIPopoverController fest. Um die Größe UIPopoverController zu einem beliebigen Zeitpunkt zu ändern, müssen Sie die Eigenschaft popoverContentSize festlegen. Beachten Sie, dass popoverContentSize eine Eigenschaft der UIPopoverController und nicht des View-Controllers ist (so brauchen Sie wahrscheinlich einen Verweis auf den Popover-Controller herum).

Zum Zurücksetzen der Größe des popover jedes Mal, wenn ein View-Controller die Draufsicht Controller eines UINavigationController wird, können Sie die UINavigationControllerDelegate Protokoll Methoden verwenden:

navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if (viewController == viewControllerToResize) { 
     referenceToUIPopoverController.popoverContentSize = CGSizeMake(320,480); 
    } 
} 
+0

Ein potenzieller Fehler ist, wenn der obere UIViewController-Parameter contentSizeForViewInPopover nicht festgelegt wurde und Sie den PopoverContentSize des UIPopoverControllers festlegen, sehen Sie zuerst die Popover-Größe für den angegebenen popoverContentSize und dann die Standardgröße (derzeit 320x1100). Um dies zu lösen, setze ich nur contentSizeForViewInPopover und dann popoverContentSize. Haftungsausschluss: Dies ist kein gut recherchierter Befund; eher was ich in meinem aktuellen Projekt auf iOS 4.3 erlebt habe. – kalperin

+0

Dieses funktionierte für mich, nachdem ich stundenlang versucht hatte, es richtig zu machen, aber ich musste eine zusätzliche Verzögerung hinzufügen, bevor ich das Popover tatsächlich in der Größe änderte. – XCool

2

In meinem Projekt hatte ich die Größe der dynamisch ändern Popover.

machte ich die Original-Controller delegieren meiner popover Inhalt Controller, und es ist Delegatmethode implementiert, die jedes Mal aufgerufen wird, die Größe geändert wird:

Der Code unten ist, hoffen, dass es jemand hilft:

-(void) popover:(UIViewController*)controller didChangeSize:(CGSize)size{ 

    if ([controller class] == [AZViewController class]){ 
     if (!_popoverController){ 
      _popoverController = [[UIPopoverController alloc] initWithContentViewController:controller]; 
     } 

     _popoverController.popoverContentSize = size; 
    } 
} 
1

Ich denke, ich könnte das herausgefunden haben, als ich mit diesem Problem für eine Weile kämpfte. Könnte ein bisschen optimistisch sein, also zögern Sie nicht zu kommentieren, wenn diese Lösung nicht für Sie arbeitet.

Legen Sie in jedem ViewController, der mit der Navigationshierarchie angezeigt wird, die contentSizeForViewInPopover-Eigenschaft in der viewDidAppear: -Methode auf die entsprechende Größe fest.

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self setContentSizeForViewInPopover:CGSizeMake(320, 320)]; 
} 

Eine andere Sache, die ich nahm, ist, dass bei der Wiedergabe tippen, während ein Textfeld bearbeiten, die Größe anstelle der größeren vorherigen Ansicht klein bleibt. Rufen Sie die Methode resignFirstResponder für Ihr textField in der ViewWillDisappear des Controllers auf.

Ich bin gespannt, ob diese Lösung über SDKs funktioniert.

+0

funktioniert nicht für mich. SDK 6, Kompilieren für iOS 4.3 – SpaceDog

0

Nachdem ich viele Dinge ausprobiert hatte, half mir die Antwort von @chuck-k anständig, meine Probleme mit dem UINavigationController-Popover in iOS7 zu lösen.

Hier ist, was ich getan habe:

  • für jeden UIViewController im UINavigationController ich den Inhalts Größe berechnen ich in der Methode angezeigt werden soll - (CGSize)contentSizeForViewInPopover Plus navigationController.navigationBar.frame.size.height (das ist immer 44 glaube ich). Ich verwende keine andere Popover-Funktionalität in diesen UIViewControllern.

  • erklärte ich meine UIViewController, die die UINavigationController als UINavigationControllerDelegate

  • dann in den Delegaten ....

.....

- (void)navigationController:(UINavigationController *)navigationController willShowViewController: (UIViewController *)viewController animated:(BOOL)animated { 

    BOOL popoverAnimation = NO; 

    if (self.myPopoverController.popoverContentSize.height < viewController.contentSizeForViewInPopover.height) popoverAnimation = YES; 

    [self.myPopoverController setPopoverContentSize:viewController.contentSizeForViewInPopover animated:popoverAnimation]; 
} 

Die Höhe

schafft check vergleicht die Popover-Inhaltsgröße des aktuellen View-Controllers mit der Inhaltsgröße des Content-Popup-Containers des "eingehenden" Views. Ich benutze animation = NO wenn von einer größer -> kleiner Popover Inhalt Größe gehen, weil sonst bekomme ich einige ruckartige Neupositionierung Animation in iOS7. Aber besonders wenn Animation = NO beim Gehen von einem kleiner -> größer popover Inhaltsgröße, die popover Größe auf die Größe erhöhen würde ich erwarteten aber würde Inhalt nicht anzeigen größer als die vorher kleinen Inhaltsgröße ... Einstellung Animation = JA löste dieses Problem für mich. (Ich überprüfe nur die Höhe, weil in meinem Fall die Breite fest ist.)

Mit dieser Technik funktioniert schließlich fast alles zu meiner Zufriedenheit und ich hoffe, dass dies jemand anderem helfen könnte.