212 votes

redimensionner UITableView pour l'adapter au contenu

Je crée une application qui comportera une question dans un UILabel et une liste de réponses à choix multiples affichée dans UITableView, chaque ligne affichant un choix multiple. Les questions et les réponses varient, j'ai donc besoin que cet UITableView soit dynamique en hauteur.

Je voudrais trouver un "sizeToFit" travail pour la table. Où le cadre de la table est défini à la hauteur de tout son contenu.

Quelqu'un peut-il me dire comment je peux y arriver? Je vous remercie.

170voto

MiMo Points 895

En fait, j'ai trouvé la réponse moi-même.

Je viens de créer un nouveau CGRect pour le nom table.frame avec la hauteur de table.contentSize.height

Cela définit la hauteur de UITableView à la hauteur de son contenu.

 CGRect frame = self.tableView.frame;
frame.size.height = self.tableView.contentSize.height;
self.tableView.frame = frame;
 

22voto

Alex Points 2444

J'ai essayé cela dans iOS 7 et cela a fonctionné pour moi

 - (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView sizeToFit];
}
 

19voto

Anooj VM Points 190

Ajouter un observateur pour la propriété contentSize dans la vue tableau et ajuster la taille du cadre en conséquence

 [your_tableview addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];
 

puis dans le rappel:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
         CGRect frame = your_tableview.frame;
         frame.size = your_tableview.contentSize;
         your_tableview.frame = frame;
    }
 

J'espère que ceci vous aidera.

0voto

whyoz Points 1308

Après avoir joué avec pendant un certain temps, j'ai trouvé que le cadre et contentSize ne semblent pas pouvoir être mis ensemble comme:

self.tableView.contentSize = CGSizeMake(320, scrollHeight);
self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,44,self.tableView.contentSize.width,self.tableView.contentSize.height);

La tentative a été de définir une hauteur max de l'image, mais garder la possibilité de parcourir l'ensemble du contenu si il y avait un grand nombre de cellules. Ce hack fonctionne bien et peut être modifié avec d'autres conditions, en cas de besoin:

int cellCount = [YOURARRAY count];
CGFloat scrollHeight = cellCount*44+44;//for a cell with height of 44 and adding 44 if you have a toolbar at the bottom

self.tableView.contentSize = CGSizeMake(320, scrollHeight);//you can change the width and or let the .xib control the autoresizing

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad && cellCount < 14)
{
    //here's were you can add more conditions if you're in landscape or portrait, but this handles 14 cells with a heightForHeaderInSection of 46 in landscape
    self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,44,self.tableView.contentSize.width,scrollHeight);
}
else if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && cellCount < 7)
{
     //same as above but it's for the iPhone in portrait
     self.tableView.frame = CGRectMake(self.tableView.frame.origin.x,44,self.tableView.contentSize.width,scrollHeight);
}

Cela fonctionne pour vous. Vous devrez peut-être ajuster la autoresizingMask à l'intérieur de votre .xib ou dans votre code, mais ce hack est la seule solution que j'ai trouvé qui prend soin de tous les différentes variables dans mon cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X