2008-11-07 17 views
9

J'ai une cellule UITableView qui va avoir une taille variable en fonction de son contenu (potentiellement plusieurs lignes de texte).Existe-t-il un meilleur moyen de déterminer la bonne taille pour un UITableViewCell?

car il semble que heightForRowAtIndexPath est appelé avant I mise en page de la cellule, je suppose que la hauteur correcte en appelant [NSString sizeWithFont] sur ma chaîne de texte. Y at-il une meilleure façon de définir la hauteur après J'ai disposé le texte dans la cellule et ai une idée de exactement quelle taille elle devrait être?

Répondre

8

Il va paraître stupide, mais ... euh ... « la disposition de votre cellule avant de quitter heightForRowAtIndexPath »;)

Sérieusement, si - le système d'exploitation n'appelle jamais cela s'il va être nécessaire (comme dans: il est sur le point de créer la cellule & l'afficher à l'écran), de sorte qu'il est & prêt à afficher n'est pas un effort inutile.

Remarquez que vous ne devez pas pas faire de faire votre mise en page séparément, en logique. Appelez simplement votre [self prepLayoutForCellAtIndex: index] dans votre routine heightForRowAtIndexPath.

Si les données sont statiques, vous pouvez créer une table de hauteur et mettre en cache les informations.

if (0 == heightTable[index]) { 
    heightTable[index] = [self prepLayoutForCellAtIndex:index]; 
} 
return (heightTable[index]); 

Heck, même si les changements de données, vous pouvez recalculer la valeur de la table dans la méthode qui modifie les données, ou claires à 0 il obtient recalculé la prochaine fois qu'il est nécessaire.

4

J'utilise ce qui suit, habituellement:

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath { 
UITableViewCell *cell = [self tableView: tableView cellForRowAtIndexPath: indexPath]; 
return cell.bounds.size.height; 

}

Notez que j'utilise ce pour les tables où je pré-cache un tas de lignes à l'avance, pas pour ceux avec beaucoup de cellules. Cependant, pour des choses comme les tables de paramètres, où il y a juste quelques lignes, mais très probablement de taille très différente, cela fonctionne bien. Pour les grandes tables, je fais quelque chose dans le sens de ce qu'Olie a suggéré.

0

Si vous examinez SMS.app par exemple, Apple enregistre la hauteur de ligne de la cellule dans la base de données sqlite SMS.app.