Как установить высоту UITextView динамически в UITableViewCell на основе размера строки?

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

вот изображение моего пользовательского UITableViewCell и всех его ограничений:

enter image description here

каждая запись содержит эти элементы пользовательского интерфейса. Единственным элементом, который может сделать высоту каждой ячейки разной, является messageView, потому что его высота зависит от строки показывается. Вопрос в том, как динамически задавать высоту каждой ячейки? Вот что у меня сейчас (не работает,messageView не отображается вообще):

func cellForRowAt(indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(...) as! PostCell

    let message = ...
    cell.messageView.text = message

    return cell
}

func heightForRowAt(indexPath: IndexPath) -> CGFloat {
    var cellMinimumHeight: CGFloat = 120
    if let cell = tableView.cellForRow(at: indexPath) as? PostCell {
        let size = cell.messageView.sizeThatFits(cell.messageView.frame.size)
        cellMinimumHeight += size.height
    }

    return cellMinimumHeight
}

на на if не выполняется, поэтому высота всех ячеек cellMinimumHeight = 120.

как я могу сделать высоту каждой ячейки = 120 + высота messageView?

---------------------------------изменить 1---------------------------------

ошибся на картинке,messageViewвысота не задана

4 ответов


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

код:

yourTextView.scrollEnabled = false

от IB:

выберите вид текста и откройте атрибуты инспектора, потом

enter image description here


в Инспекторе атрибутов выберите UITextView(messageView) и снимите флажок "прокрутка".

, а затем изменить свой UITextView(messageView)'s приоритет сопротивления сжатию содержимого следующим образом: Горизонтальный = 750 Вертикальный = 1000

Я надеюсь, что это поможет вам.


просто отключите прокрутку UITextview... Но здесь нет использования UITextview, вы также можете использовать label.

в методе делегата heightforrow tableview удалите этот материал и используйте

return UITableViewAutomaticDimension

вы использовали constrain, чтобы сделать высоту ячейки динамической

форма документации apple

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

Так что для вашего случая нужно

высота ячейки = 120 + высота messageView?

Итак, начните с изображения профиля для измерения непрерывная цепь ограничения сверху вниз

  1. изображение профиля top = 10 + ImageHeight = 60 ---- > 70

  2. MessageView top = 10 + установите минимальную высоту сообщения, чтобы сказать 20 одну строку, если каждая ячейка должна иметь сообщение, даже если одно слово и установить это высота больше или равна 20 убедитесь, что вы set Scroll enable = false таким образом, минимальная высота сообщения = 10 сверху + 20 + 10 снизу - - - > 40

  3. Высота вида стека меню - - ->30

Итак, все итого = 70 + 40 + 30 = 140 эта высота по умолчанию ни одна ячейка не будет меньше этой

также вы должны установить свойство rowHeight представления таблицы в UITableViewAutomaticDimension. Вы также должны присвоить значение estimatedRowHeight свойства

tableView.estimatedRowHeight = 130.0
tableView.rowHeight = UITableViewAutomaticDimension

вот документация apple здесь