Comment modifier dynamicment la taille de contenu de UIPopoverController?

J'ai un UIViewController qui contient un UITableView . Ce UIViewController est affiché dans un UIPopoverController .

Maintenant, les choses sont que le nombre d'éléments dans la tableView n'est pas constant, et je veux que la taille de la popover (c'est-à-dire le popoverContentSize ), pour ajuster en fonction du nombre d'éléments dans la tableView

Naively, je pensais que si je vais mettre le contentSizeForViewInPopover dans viewDidLoad après que je charge la tableView avec tous les éléments – Ça va le faire.

Ce n'est pas le cas.

Donc, le faire court, ma question est: Comment puis-je changer le popoverContentSize directement à partir du contentViewController – après qu'il a été présenté?

Annexe: entrez la description de l'image ici

Je pourrais être très en retard pour répondre, mais pour un nouvel user d'iOS 7, veuillez utiliser la ligne suivante dans votre UIViewController i, e contentViewController de votre UIPopOverViewConotroller

 -(void) viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; self.preferredContentSize=myTableView.contentSize; } 

Espérons que cela aidera pour l'user iOS 7.

Eh bien, à la fin j'ai fait quelque chose que je ne suis pas sûr si c'est la bonne chose à faire, mais ça marche.

J'ai ajouté une reference dans mon contentViewController au popoverController:

 @property (nonatomic , assign) UIPopoverController *popoverControllerContainer; 

Ensuite, j'ai ajouté le code de redimensionnement à viewWillAppear et viewDidAppear:

 - (void)viewDidLoad { [super viewDidLoad]; [self.tableView reloadData]; } -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; self.contentSizeForViewInPopover = self.tableView.contentSize; } -(void) viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self.popoverControllerContainer setPopoverContentSize:self.contentSizeForViewInPopover animated:YES]; } 

Donc, garder une reference à la popover est une sorte de hack-ish, donc je suis ouvert à entendre de meilleures idées.

Une class UIViewController a la propriété

 self.contentSizeForViewInPopover 

qui va resize le pop sans avoir besoin d'append une reference à celui-ci.

Et pour développer une solution, j'ai utilisé la méthode rectForSection: pour get la taille de la section (la mienne n'a qu'une seule section, assez facile à get) et ensuite ajouté la hauteur de la barre de navigation (elle semble être 20). donc je suis capable de créer le popover de la taille de la vue de table terminée:

 CGRect sectionRect = [view.tableView rectForSection:0]; if (sectionRect.size.height + 20 < POPOVER_SIZE.height) view.contentSizeForViewInPopover = CGSizeMake(POPOVER_SIZE.width, sectionRect.size.height + 20); else view.contentSizeForViewInPopover = POPOVER_SIZE; 

pourrait s'avérer plus difficile avec plusieurs sections, je ne l'ai pas essayé. devrait juste être capable de résumer les hauteurs de section, mais il pourrait y avoir quelques problèmes d'espacement que je ne connais pas.

Pour iOS 7 ou supérieur.

 - (CGSize)preferredContentSize { return CGSizeMake(320, 550); } 

Si vous êtes un enfant d'un conteneur, redirigez la taille du contenu vers vous. Par exemple, dans une sous-class UINavigationController :

 - (CGSize)preferredContentSize { return self.topViewController.preferredContentSize; } 

Mon application a un menu avec des sous-menus provenant d'un popover et embedded dans un controller de navigation, à savoir quelque chose comme UINavigationController -> TopMenuViewController -> SubMenuViewController xN.

Aucune des solutions ci-dessus n'a fonctionné pour moi.

Ma solution: Dans ma class de controller de vue de menu racine, à partir de laquelle tous les autres controllers de vue de menu héritent, ajoutez le code suivant:

 - (void)viewDidLoad { [super viewDidLoad]; self.navigationController.preferredContentSize = CGSizeMake(450.0f, 0.0f);// increase standard width (320.0) } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.navigationController.preferredContentSize = self.tableView.contentSize; } 

J'avais ce même problème et aucune des réponses que j'ai trouvées n'a fonctionné. J'ai bricolé set que je pense fonctionne bien.

J'ai un tableau dans mon initWithCoder qui contient mes valeurs. Je cours simplement ce code:

 - (id)initWithCoder:(NSCoder *)aDecoder { //Popover Choices _importantChoices = [NSMutableArray array]; [_importantChoices addObject:@"Bakery"]; [_importantChoices addObject:@"Beverage Dry Mix"]; [_importantChoices addObject:@"Beverage RTD"]; [_importantChoices addObject:@"Crisps"]; [_importantChoices addObject:@"Meat"]; [_importantChoices addObject:@"Supplements"]; //Calculate size of Popover self.clearsSelectionOnViewWillAppear = NO; NSInteger rowsCount = [_importantChoices count]; NSInteger singleRowHeight = [self.tableView.delegate tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; NSInteger totalRowsHeight = rowsCount * singleRowHeight; CGFloat largestLabelWidth = 0; for (NSSsortingng *tmp in _importantChoices) { CGSize labelSize = [tmp sizeWithAtsortingbutes:@{NSFontAtsortingbuteName:[UIFont systemFontOfSize:20.0f]}]; if (labelSize.width > largestLabelWidth) { largestLabelWidth = labelSize.width; } } CGFloat popoverWidth = largestLabelWidth + 100; //Add a little padding to the width self.preferredContentSize = CGSizeMake(popoverWidth, totalRowsHeight); return self; } 

Solution iOS8 / 9 – remplacez simplement preferredContentSize et forcez l'affichage de la table à la layout avant de renvoyer contentSize .

 - (CGSize)preferredContentSize { [self.tableView layoutIfNeeded]; return self.tableView.contentSize; } 

Cela devrait faire l'affaire

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}