Как динамически изменять размер высоты UITableViewCell
У меня есть классический сгруппированный UITableView с редактируемыми UITextViews внутри каждой ячейки. Эти текстовые представления могут быть одинарными или многострочными, и я хочу, чтобы ячейка увеличивала свою высоту по мере записи пользователем, а текст начинал новую строку.
мой вопрос: мне нужно перезагрузить всю таблицу, чтобы увеличить высоту ячейки? Разве нет другого способа?
Я искал много, и предыдущие ответы и учебники просто поговорим о том, как вычислить высоту текста, как реализовать heightForRowAtIndexPath... то, что я уже знаю. Меня беспокоит то, что для достижения того, что я хочу, мне придется вычислять высоту и перезагружать таблицу каждый раз, когда пользователь вводит новый символ, который я не нахожу очень чистым или эффективным.
спасибо.
4 ответа:
вам не всегда нужно перезагружать всю таблицу. Вместо этого вы можете просто перезагрузить эту строку.
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
чтобы быть более конкретным, то да, вы должны реализовать
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];