Redimensionner la taille de UITableView pour qu'elle soit aussi élevée que nécessaire pour ne contenir que la taille totale du contenu

J'ai donc un problème très basique. J'ai cette UITableView dans une view , et je voudrais faire la hauteur de cette table aussi haute qu'elle doit être pour afficher toutes les lignes dans la table. Par conséquent, je ne veux pas être en mesure de faire défiler, je veux juste que toutes les lignes apparaissent. (Les rangées sont dynamics en quantité et en height ).

 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGSize cellSize = [[[_stepsArray objectAtIndex:indexPath.row]content] sizeWithFont:[UIFont boldSystemFontOfSize:18.0f] constrainedToSize:CGSizeMake(528.0f, CGFLOAT_MAX)lineBreakMode:NSLineBreakByWordWrapping]; return cellSize.height; } 

S'il y a 20 lignes, la table sera très haute, mais s'il n'y a qu'une seule ligne, elle sera très petite et l'autre contenu n'apparaîtra pas 19 lignes plus bas.

si je comprends bien, vous devriez être en mesure d'additionner la hauteur de chaque rangée et d'ajuster la hauteur de la table en fonction de cela:

 CGFloat tableHeight = 0.0f; for (int i = 0; i < [_stepsArray count]; i ++) { tableHeight += [self tableView:self.tableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; } self.tableView.frame = CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y, self.tableView.frame.size.width, tableHeight); 

vous pouvez le faire immédiatement après [tableView reloadData]

Voici une solution plus simple: Tout ce dont vous avez besoin est de définir sizeToFit sur votre UITableView , après qu'il ait été UITableView avec des cellules. Si vous définissez delegate et dataSource via xib , vous pouvez le faire dans votre méthode viewDidAppear ou viewDidAppear , comme ceci:

 - (void)viewDidLoad { [super viewDidLoad]; [yourTableView sizeToFit]; } 

Mais, si vous ajoutez delegate et dataSource quelque part dans le code, vous devez mettre sizeToFit après ceci:

 - (void)someMethod { [yourTableView setDelegate:self]; [yourTableView setDataSource:self]; [yourTableView sizeToFit]; } 

En outre, vous devez le faire après reloadTable, si vous le faites quelque part.

Cela va resize votre table exactement à la hauteur qui est la sum de la hauteur de ses cellules!

Tu peux essayer comme ça,

 -(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if([indexPath row] == ((NSIndexPath*)[[tableView indexPathsForVisibleRows] lastObject]).row){ NSLog(@"%f",your_tableView.contentSize.height); } } 

Dans Swift 3.0

 func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == tableView.indexPathsForVisibleRows?.last?.row { print("\(tableView.contentSize.height)") } } 

Ajoutez un observateur pour la propriété contentSize sur la vue de table et ajustez la taille de cadre en conséquence

Dans viewDidLoad, ajoutez la ligne de code suivante

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

puis dans le callback:

 - (void)observeValueForKeyPath:(NSSsortingng *)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.

Utilisez simplement tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; Cela va résoudre ton problème.

Définissez une contrainte de hauteur sur la table, connectez-vous à une prise et ajoutez ce qui suit à votre controller de vue:

 override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() tableViewHeightContraint.constant = tableView.contentSize.height }