Как изменить высоту ячейки при изменении text View Swift 4?

Для изменения высоты ячейки при изменении содержимого внутри text View в Swift 4 вам необходимо выполнить следующие шаги:

1. Создайте класс наследник UITableViewCell для вашей ячейки. Предположим, что ваш класс называется CustomTableViewCell.

class CustomTableViewCell: UITableViewCell {
    @IBOutlet weak var textView: UITextView!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Настройте делегата для textView, чтобы отслеживать изменения
        textView.delegate = self
    }
}

// Расширение класса для реализации делегата UITextViewDelegate
extension CustomTableViewCell: UITextViewDelegate {
    func textViewDidChange(_ textView: UITextView) {
        // Вызывается каждый раз, когда текст в textView изменяется
        // Обновите таблицу, чтобы перерисовать ячейку с новой высотой
        tableView?.beginUpdates()
        tableView?.endUpdates()
    }
}

2. Добавьте UITextView на вашу ячейку в storyboard и соедините его с IBOutlet textView в классе CustomTableViewCell.

3. В вашем контроллере таблицы (например, в методе cellForRowAt), настройте параметры ячейки и присвойте ей высоту с использованием метода sizeThatFits. Обратите внимание, что вы также должны иметь высоту ячейки по умолчанию в свойстве estimatedRowHeight таблицы.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomTableViewCell
    
    // Настройте содержимое ячейки здесь, если необходимо
    
    // Вычислите новую высоту ячейки на основе высоты textView
    let newSize = cell.textView.sizeThatFits(CGSize(width: cell.textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude))
    
    // Обновите высоту ячейки
    cell.textView.frame.size = newSize
    
    // Обновите высоту ячейки таблицы
    return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}

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

4. Теперь при каждом изменении текста в textView, метод textViewDidChange будет вызываться и ячейка будет перерисовываться с использованием новой высоты.