Как динамически изменить высоту UITableViewCell - PullRequest
57 голосов
/ 18 июня 2010

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

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

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

Спасибо.

Ответы [ 4 ]

84 голосов
/ 14 января 2011
[tableView beginUpdates];
[tableView endUpdates];
62 голосов
/ 18 июня 2010

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

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
27 голосов
/ 18 июня 2010

Чтобы быть более точным, да, вам нужно реализовать 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];
}
5 голосов
/ 04 октября 2012

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

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