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 }