Donc, j'ai un problème très fondamental. J'ai cette UITableView
dans une view
et j'aimerais rendre la hauteur de cette table aussi élevée que nécessaire pour afficher TOUTES les lignes de la table. Par conséquent, je ne veux pas pouvoir faire défiler, je veux juste que toutes les lignes apparaissent. (Les lignes sont dynamiques en quantité et 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 en dessous.
si je le comprends bien, vous devriez pouvoir additionner la hauteur de chaque ligne et 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: il vous suffit de définir sizeToFit
sur votre UITableView
, une fois que celle-ci a été remplie de cellules. Si vous définissez delegate
et dataSource
à xib
, vous pouvez le faire dans votre méthode viewDidLoad
, 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 redimensionnera votre table exactement à la hauteur qui est la somme 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)")
}
}
Définissez une contrainte de hauteur sur la table, connectez-vous à une prise et ajoutez les éléments suivants à votre contrôleur de vue:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableViewHeightContraint.constant = tableView.contentSize.height
}
Ajouter un observateur pour la propriété contentSize dans la vue tableau et ajuster la taille du 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 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.
Utilisez simplement tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
Cela résoudra votre problème.