web-dev-qa-db-fra.com

Comment redimensionner dynamiquement la hauteur UITableViewCell

J'ai le UITableView groupé classique avec UITextViews modifiable à l'intérieur de chaque cellule. Ces vues de texte peuvent être simples ou à lignes multiples, et je souhaite que la cellule augmente sa hauteur au fur et à mesure que l'utilisateur écrit et que le texte commence une nouvelle ligne.

Ma question est: dois-je recharger la table entière juste pour augmenter la hauteur d'une cellule? N'y a-t-il pas d'autre méthode?

J'ai beaucoup cherché, et les réponses et les didacticiels précédents parlent simplement de la façon de calculer la hauteur du texte, de la façon d'implémenter heightForRowAtIndexPath ... des choses que je connais déjà. Ma préoccupation est que, pour atteindre ce que je veux, je devrai calculer la hauteur et recharger la table à chaque fois que l'utilisateur saisira un nouveau caractère, ce que je ne trouve pas très propre ou efficace.

Merci.

57
araid

Vous n'avez pas toujours besoin de recharger la table entière. Vous pouvez à la place simplement recharger cette ligne.

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
62
rickharrison
[tableView beginUpdates];
[tableView endUpdates];
84
Andrey Zverev

Pour être plus précis, oui, vous devez implémenter tableView:heightForRowAtIndexPath: pour calculer la nouvelle hauteur, puis faites comme le dit Rickharison et appelez [tableView reloadRowsAtIndexPaths:withRowAnimation]. Disons que vos cellules peuvent avoir une hauteur étendue et une hauteur normale, et que vous souhaitez qu'elles grandissent lorsqu'elles sont tapotées. Tu peux faire:

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*) indexPath 
{
    if ([expandedPaths containsObject:indexPath]) {
        return 80;
    } else {
        return 44;
    }
 }

-(void)tableView:(UITableView*) didSelectRowAtIndexPath:(NSIndexPath*) indexPath
{
    [expandedPaths addObject:indexPath];
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
27
Elfred

-reloadRowsAtIndexPaths:withRowAnimation n'a pas redimensionné la hauteur UITableViewCell, même après avoir modifié le cadre de la cellule. Cela n'a fonctionné que lorsque je l'ai suivi avec un -reloadData:

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[tableView reloadData];
5
windson