web-dev-qa-db-fra.com

Comment changer dynamiquement la taille du contenu de UIPopoverController?

J'ai une UIViewController qui contient une UITableView. Cette UIViewController est affichée dans une UIPopoverController.

Le problème, c’est que le nombre d’éléments de la tableView n’est pas constant et que je souhaite que la taille de la popover (c’est-à-dire la popoverContentSize) soit ajustée en fonction du nombre d’éléments de la tableView

Naïvement, je pensais que si je définissais la contentSizeForViewInPopover dans viewDidLoad après le chargement de la tableView avec tous les éléments, ça le ferait.

Ça n'a pas.

Pour résumer, ma question est la suivante: comment puis-je modifier la popoverContentSize directement à partir de la contentViewController - après sa présentation?

Appendice:enter image description here

26
Avraham Shukron

Je serais peut-être très tard pour répondre, mais pour les nouveaux utilisateurs 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;
}

J'espère que cela aidera les utilisateurs d'iOS 7.

47
Avinash

En fin de compte, j’ai fait quelque chose que je ne suis pas sûr de savoir si c’est la bonne chose à faire, mais cela fonctionne.

J'ai ajouté une référence dans mon contentViewController au popoverController:

@property (nonatomic , assign) UIPopoverController *popoverControllerContainer;

Ensuite, j'ai ajouté le code de redimensionnement pour 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 référence à la popover est une sorte de hack-ish, alors je suis ouvert à entendre de meilleures idées. 

9
Avraham Shukron

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-même. Par exemple. Dans une sous-classe UINavigationController:

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

A UIViewController class a la propriété 

self.contentSizeForViewInPopover

ce qui redimensionnera la pop over sans avoir besoin d'y ajouter une référence.

Et pour développer une solution, j’ai utilisé la méthode rectForSection: pour obtenir la taille de la section (le mien n’a qu’une section, assez facile à obtenir), puis j’ai ajouté la hauteur de la barre de navigation (il semble que être 20). donc je suis capable de créer le popover de la taille de la vue de table finie:

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 se révéler 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.

7
Padin215

Mon application comporte un menu avec des sous-menus issus d’un popover et intégrés à un contrôleur de navigation, par exemple, quelque chose comme UINavigationController -> TopMenuViewController -> SubMenuViewControllerxN.

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

Ma solution: Dans ma classe de contrôleur d'affichage de menu racine, d'où héritent tous les autres contrôleurs d'affichage de menu, 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;
}
1
Mojo66

J'avais ce même problème et aucune des réponses que j'ai trouvées ne fonctionnait. J'ai bricolé ensemble que je pense fonctionne bien.

J'ai un tableau dans mon initWithCoder qui contient mes valeurs. Je lance 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 (NSString *tmp in _importantChoices) {
    CGSize labelSize = [tmp sizeWithAttributes:@{NSFontAttributeName:[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;
}
0
Bryan Schmiedeler

Cela devrait faire l'affaire

override func viewWillLayoutSubviews() {
  super.viewWillLayoutSubviews()

  self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)}
0
user431791

solution iOS8/9 - remplacez simplement preferredContentSize et forcez la présentation du tableau à la disposition avant de renvoyer sa contentSize.

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