web-dev-qa-db-fra.com

comment obtenir une hauteur de ligne UITableView à la taille automatique de la taille de UITableViewCell?

Comment obtenir une hauteur de ligne UITableView à la taille automatique de la taille de UITableViewCell? 

Donc, en supposant que je crée UITableViewCell dans Interface Builder, et que sa hauteur soit supérieure à la taille standard, comment puis-je obtenir la hauteur de ligne UITableView pour la réduire automatiquement? (c'est-à-dire par opposition à l'obligation de mesurer manuellement la hauteur dans le générateur d'interface et de la définir par programme)

21
Greg

Si toutes les cellules sont identiques, définissez la propriété rowHeight sur UITableView à la taille de votre cellule. S'ils sont tous différents en fonction du contenu, vous devrez implémenter -tableView:heightForRowAtIndexPath: et calculer la hauteur pour chaque ligne en fonction de votre source de données.

31
Mark Adams

http://www.cimgf.com/2009/09/23/uitableview-dynamic-height/ est un excellent tutoriel pour cela. 

Le bit principal est

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
{
  // Get the text so we can measure it
  NSString *text = [items objectAtIndex:[indexPath row]];
  // Get a CGSize for the width and, effectively, unlimited height
  CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f);
  // Get the size of the text given the CGSize we just made as a constraint
  CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap];
  // Get the height of our measurement, with a minimum of 44 (standard cell size)
  CGFloat height = MAX(size.height, 44.0f);
  // return the height, with a bit of extra padding in
  return height + (CELL_CONTENT_MARGIN * 2);
}
37
Brian

Dans le xib avec votre table, vous pouvez ajouter un objet de cellule et le lier à un IBOutlet dans votre code source. Vous ne l'utiliserez nulle part, vous l'utiliserez simplement pour obtenir la hauteur de la cellule.

Ensuite, dans tableView:heightForRowAtIndexPath:, vous pouvez utiliser cet objet pour obtenir la hauteur. Ce n'est pas automatique à 100%, mais au moins, cela vous évite d'avoir à mettre à jour manuellement votre code source lorsque vous apportez des modifications à la vue des cellules dans IB.


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return myDummyCellObject.bounds.size.height;
}

Si toutes les lignes sont du même type (cellule), vous pouvez définir par programme la propriété tableView.rowHeight au lieu d'implémenter la méthode déléguée ci-dessus. Cela dépend de votre scénario.

Oh, et assurez-vous de ne pas oublier de publier myDummyCellObject dans -dealloc.

13
Andrei Stanescu

Depuis iOS 8, vous avez la possibilité de travailler avec des cellules à dimensionnement automatique en spécifiant ces options sur votre vue tableau:

tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableView.automaticDimension

Cela fonctionnera tant que le système pourra calculer les lignes en fonction des contraintes existantes ou du contenu. Attention, si vous définissez automaticDimension, alors heightForRowAtIndexPath ne sera pas appelé!


Parfois, avec des données plus complexes, certaines cellules peuvent être calculées automatiquement, mais d'autres nécessitent une logique de calcul de hauteur spécifique. Dans ce cas, vous ne devez utiliser que only pour définir la durée de consolidation projetée, puis implémenter cellForRowAtIndexPath avec une logique automatique pour les cellules pouvant fonctionner correctement:

// Set the estimated row height in viewDidLoad, but *not* automatic dimension!
override func viewDidLoad() {
    // other viewDidLoad stuff...
    tableView.estimatedRowHeight = 85.0
    tableView.delegate = self
}

// Then implement heightForRowAtIndexPath delegate method
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if theAutomaticCalculationWorksForThisRow {
        return UITableView.automaticDimension
    } else {
        // Calculate row height based on custom logic...
        let rowHeight = 85.0
        return rowHeight
    }
}
0
Aron
self.tableView.estimatedRowHeight = 65.0; // Estimate the height you want
self.tableView.rowHeight = UITableViewAutomaticDimension; // auto change heights for multiple lines cells.

Lorsque vous implémentez la méthode requise UITableViewDataSource:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.textLabel.text = [self.todoArray objectAtIndex:indexPath.row];
    cell.textLabel.numberOfLines = 0; // allow multiple lines showing up

    return cell;
}
0
AidenX