Подтвердить что ты не робот

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

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

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

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

Спасибо.

4b9b3361

Ответ 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];