Как динамически изменять размер высоты UITableViewCell


У меня есть классический сгруппированный UITableView с редактируемыми UITextViews внутри каждой ячейки. Эти текстовые представления могут быть одинарными или многострочными, и я хочу, чтобы ячейка увеличивала свою высоту по мере записи пользователем, а текст начинал новую строку.

мой вопрос: мне нужно перезагрузить всю таблицу, чтобы увеличить высоту ячейки? Разве нет другого способа?

Я искал много, и предыдущие ответы и учебники просто поговорим о том, как вычислить высоту текста, как реализовать heightForRowAtIndexPath... то, что я уже знаю. Меня беспокоит то, что для достижения того, что я хочу, мне придется вычислять высоту и перезагружать таблицу каждый раз, когда пользователь вводит новый символ, который я не нахожу очень чистым или эффективным.

спасибо.

4 56

4 ответа:

вам не всегда нужно перезагружать всю таблицу. Вместо этого вы можете просто перезагрузить эту строку.

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
[tableView beginUpdates];
[tableView endUpdates];

чтобы быть более конкретным, то да, вы должны реализовать tableView:heightForRowAtIndexPath: чтобы вычислить новую высоту, затем сделайте, как говорит рикхаррисон, и позвоните [tableView reloadRowsAtIndexPaths:withRowAnimation]. Допустим, ваши ячейки могут иметь расширенную высоту и нормальную высоту, и вы хотите, чтобы они росли при нажатии. Вы можете сделать:

-(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];
}

-reloadRowsAtIndexPaths:withRowAnimation не изменил размер высоты UITableViewCell, даже после того, как я изменил рамку ячейки. Он работал только тогда, когда я следовал за ним с -reloadData:

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