2010-05-28 5 views
16

J'ai un UIPopoverController avec une sous-classe UINavigationController. Les vues parent et enfant sont UITableviews.UIPopoverController w/Sous-vue UINavigationController contentSizeForViewInPopover ne fonctionne pas sur Parent

Lorsque j'appelle la vue parent à l'origine avec contentSizeForViewInPopover = (320,480), cela fonctionne très bien.

Lorsque je clique sur la vue enfant i redimensionnez la popover à contentSizeForViewInPopover = (320780)

Lorsque le retour en arrière à la vue parent je ne peux pas obtenir le popover pour redimensionner revenir à contentSizeForViewInPopover = (320480). le popover reste à la taille (320,780).

Vous avez tout essayé, mais vous avez manqué quelque chose. Quelqu'un sait comment redimensionner la vue avec UIPopoverControllers dans le scénario ci-dessus?

Merci d'avance !!

+0

quelqu'un? Je n'ai toujours pas été en mesure de redimensionner correctement mon popover. Il est facile d'augmenter la taille mais je ne peux pas l'obtenir pour revenir à la taille d'origine plus petite. – Abbacore

+0

Bon marquage est le moyen d'obtenir une réponse à votre question :) – skaffman

Répondre

13

J'ai eu le même problème, mais aucune des solutions ci-dessus n'a fonctionné pour moi. Cependant, en essayant de combiner leurs approches, j'ai été inspiré pour essayer une manière légèrement différente d'attaquer le problème. Cela fonctionne pour moi:

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

J'ai trois popovers différents qui utilisent chacun des contrôleurs de navigation. Cette solution a l'avantage de fonctionner pour tous, car elle ne fait référence à aucun des contrôleurs popover, mais finit par utiliser le popoverContentSize du contrôleur popover actuellement utilisé.

+0

Après avoir essayé toutes les méthodes dans ce fil et d'autres endroits, cela a été la seule façon pour moi de faire ce travail. Merci. –

+0

Je l'ai trouvé dans la documentation: "Cette propriété contient la taille désirée pour le contrôleur de vue lorsqu'il est affiché dans un popover.Par défaut, la largeur est fixée à 320 points et la hauteur est fixée à 1100 points." Donc, si vous Ne définissez pas explicitement contentSizeForViewInPopover, il s'agira de 320x1100, cela me rendait fou car je pensais qu'Apple utiliserait des valeurs par défaut saines et rendrait contentSizeForViewInPopover par défaut dans le cadre de la vue ou quelque chose, mais apparemment ce n'est pas le cas. Mettez donc contentSizeForViewinPopover si vous voulez que votre popover se comporte! – mgrandi

+0

Cela a fonctionné pour moi aussi, mais je ne sais pas pourquoi. dimensionnement popovers semble buggé. Parfois, ils seront redimensionnés correctement, d'autres fois vous devez définir une étrange chaîne de méthodes juste pour le faire fonctionner correctement. – LightningStryk

1

Je pense que j'avais le même problème et je l'ai résolu en définissant la taille de la vue dans le popover chaque fois que la vue était sur le point d'apparaître. Comme ceci:

 

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

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

J'espère que cela vous aide.

+0

merci pour l'entrée enrigue. à l'origine, j'ai essayé cela et ne semble pas faire quoi que ce soit. Imaginez, le parent popover s'ouvre à 320x480. Ensuite, je sélectionne une ligne qui pousse une vue "enfant" à l'intérieur du popover qui est 320x720. si je clique sur le bouton retour, ma vue "parent" est toujours 320x720. – Abbacore

+0

Pouvez-vous détecter quand ils poussent le bouton de retour ou quand la vue précédente montre à nouveau après qu'ils touchent le bouton de retour? Si vous pouvez le détecter, vous pouvez placer 'contentSizeForViewInPopover' dans cette partie du code. –

24

La propriété contentSizeForViewInPopover du contrôleur de vue définit uniquement la taille (initiale) par défaut de son UIPopoverController contenant. Pour redimensionner le UIPopoverController à un moment arbitraire, vous devez définir sa propriété popoverContentSize. Notez que popoverContentSize est une propriété du UIPopoverController et pas du contrôleur de vue (donc vous aurez probablement besoin d'une référence au contrôleur de popover autour).

Pour réinitialiser la taille du popover chaque fois qu'un contrôleur de vue devient le contrôleur de vue de dessus d'un UINavigationController, vous pouvez utiliser les méthodes de protocole UINavigationControllerDelegate:

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

Si vous n'avez pas défini la propriété contentSizeForViewInPopover de UIViewController, et que vous avez défini popoverContentSize de UIPopoverController, la taille de survol s'affiche d'abord sur la valeur de popoverContentSize spécifiée, puis sur la taille par défaut (actuellement 320x1100). Pour résoudre cela, je viens de définir contentSizeForViewInPopover, puis popoverContentSize. Avertissement: ce n'est pas une découverte bien documentée; plutôt ce que j'ai vécu dans mon projet actuel sur iOS 4.3. – kalperin

+0

Celui-ci a fonctionné pour moi après avoir essayé pendant des heures pour bien faire les choses, mais j'ai dû ajouter un délai supplémentaire avant de redimensionner le popover. – XCool

2

Dans mon projet, je devais changer dynamiquement la taille du popover.

J'ai fait le délégué du contrôleur original de mon contrôleur de contenu popover et mis en œuvre c'est la méthode de délégué qui est appelé à chaque fois que la taille est modifiée:

Le code est ci-dessous, espère que cela aide quelqu'un:

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

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

     _popoverController.popoverContentSize = size; 
    } 
} 
1

Je pense que j'aurais pu comprendre cela pendant que je luttais avec ce problème pendant un moment maintenant. Peut-être un peu optimiste, n'hésitez pas à nous faire part de vos commentaires si cette solution ne fonctionne pas pour vous.

Dans chaque viewController affiché avec la hiérarchie de navigation, définissez la propriété contentSizeForViewInPopover de la méthode viewDidAppear: à sa taille appropriée.

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

Une autre chose que je pris est que lorsque vous tapez dos lors de l'édition d'un textField, la taille reste faible au lieu de la plus grande vue précédente. Appelez la méthode resignFirstResponder sur votre textField dans viewWillDisappear du contrôleur.

Je suis curieux de savoir si cette solution fonctionne à travers les sdks.

+0

ne fonctionne pas pour moi. SDK 6, compilation pour iOS 4.3 – SpaceDog

0

Après avoir essayé beaucoup de choses, la réponse par @ chuck-k m'a aidé à résoudre décemment mes problèmes de popover UINavigationController dans iOS7.

Voici ce que je l'ai fait:

  • pour chaque UIViewController dans le UINavigationController je calcule la taille du contenu que j'afficher dans la méthode - (CGSize)contentSizeForViewInPopover, plus navigationController.navigationBar.frame.size.height (qui est toujours 44 je crois). Je n'utilise aucune autre fonctionnalité Popover dans ces UIViewControllers.

  • Je déclare mon UIViewController qui crée le UINavigationController comme UINavigationControllerDelegate

  • Puis, dans le délégué ....

.....

- (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]; 
} 

La hauteur check compare la taille du contenu du survol du contrôleur de vue actuel à la taille du contenu du survol du contrôleur de vue "entrant". J'utilise animation = NO en passant d'un plus grand -> plus petit taille de contenu popover, car sinon je reçois une animation de repositionnement saccadée dans iOS7. Mais particulièrement si animation = NO lors du passage d'un plus petit -> plus grande taille du contenu popover, le popover taille augmenterait la taille que je me attendais mais n'affiche contenu plus grand que le plus petit précédemment taille du contenu ... paramètre animation = OUI résolu ce problème pour moi. (Je ne vérifie la hauteur que parce que dans mon cas la largeur est fixe.)

En utilisant cette technique, presque tout fonctionne finalement à ma satisfaction et j'espère que cela pourrait aider quelqu'un d'autre.

Questions connexes