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