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

IOS 8 автоматическая калибровка UITableViewCell с UITextView

В iOS 8 был введен способ, позволяющий tableViews автоматически корректировать высоту своей ячейки на основе их содержимого (через AutoLayout).

// in viewDidLoad:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0

Я уже работал с ярлыками, изображениями и т.д.

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

Дополнительная информация о настройке: UITextView внутри ячейки имеет горизонтальные и вертикальные ограничения для представления содержимого таблицы viewView. Я также отключил прокрутку для текстового вида.

Я также попытался изменить ограничение высоты ячейки вручную, но ячейка также не примет эти изменения.

4b9b3361

Ответ 1

Если все настроено правильно (ограничения Auto Layout), вы не должны сами что-то вычислять.

Все, что вам нужно сделать, это отключить свойство разрешенной прокрутки UITextView, а затем textViewDidChange вызвать tableView.beginUpdates() и tableView.endUpdates().

Подробное объяснение можно найти в сообщении которое я написал, которое также включает рабочий образец проекта.

Ответ 2

Перезагрузите ячейку в методе textViewDidBeginEditing: вашего UITextViewDelegate

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];

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

Ответ 3

Решение для Swift 4

func textViewDidChange(_ textView: UITextView) {
    let fixedWidth = textView.frame.size.width
    let oldSize = textView.frame.size
    let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT)))
    if oldSize.height != newSize.height {
        UIView.setAnimationsEnabled(false)
        var newFrame = textView.frame
        newFrame.size = CGSize(width: fmax(newSize.width, fixedWidth), height: newSize.height)
        textView.frame = newFrame
        self.tableView.beginUpdates()
        self.tableView.endUpdates()
        UIView.setAnimationsEnabled(true)
    }
}

Ответ 4

Это функция, которую я использую, которая решает проблему отображения табличного представления после каждого нажатия клавиши.

 - (void)textViewDidChange:(UITextView *)textView {

    CGFloat fixedWidth = textView.frame.size.width;
    CGSize oldSize = textView.frame.size;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
        // Resize cell only when cell size changes, to prevent bouncing back and forth.
        if (oldSize.height != newSize.height) {
        [UIView setAnimationsEnabled:NO];
        CGRect newFrame = textView.frame;
        newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
        textView.frame = newFrame;
        [self.tableView beginUpdates];
        [self.tableView endUpdates];
        [UIView setAnimationsEnabled:YES];
        }
    }

Ответ 5

Вы должны отключить прокрутку из вашего UITextView

Ответ 6

tableView должен быть проинформирован о том, что textView изменился. Другие сообщения обычно отвечают на "статическую" проблему textView. Однако, если вы печатаете внутри таблицы, ячейка должна расти по мере роста textView. textView растет путем отключения прокрутки. Ячейка растет, устанавливая верхние и нижние ограничения textView на ограничения contentView ячейки. Это будет работать один раз, после загрузки таблицы. Однако, чтобы заставить tableView расти в реальном времени, вы должны выполнить вызов делегата textView didChange

func textViewChanged(onCell cell: YourCustomCell) {
    UIView.setAnimationsEnabled(false)
    tableView.beginUpdates()
    tableView.endUpdates()
    UIView.setAnimationsEnabled(true)
}

Это будет работать, как вы ожидаете. Ячейка будет расти по мере того, как вы печатаете, и "подпрыгивания" не будет.