Как принудительно задать высоту ячейки в UITableView?

Ответ

Высоту ячейки можно задать явно, реализовав метод делегата tableView(_:heightForRowAt:). Это позволяет управлять высотой программно, независимо от содержимого ячейки.

Пример явного задания высоты:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Задаем разную высоту в зависимости от секции или строки
    switch indexPath.section {
    case 0:
        return 44.0 // Стандартная высота
    case 1:
        return indexPath.row % 2 == 0 ? 60.0 : 80.0 // Разная высота
    default:
        return UITableView.automaticDimension // Автоматическая высота
    }
}
Сравнение подходов: Способ Метод Когда использовать
Явная высота tableView(_:heightForRowAt:) Когда высота известна заранее и фиксирована или легко вычисляется. Высокая производительность.
Автоматическая высота tableView.estimatedRowHeight + UITableView.automaticDimension + Auto Layout в ячейке Когда высота зависит от динамического контента (текст, изображения). Может быть менее производительным.

Как обновить высоту после изменения? Чтобы таблица пересчитала и анимировала изменение высоты, нужно обновить данные с помощью beginUpdates()/endUpdates():

// 1. Изменить данные, влияющие на расчет высоты.
// 2. Запросить обновление таблицы.
tableView.beginUpdates()
tableView.endUpdates()
// Метод heightForRowAt будет вызван заново для видимых ячеек.

Важно: Для максимальной производительности при использовании heightForRowAt: рекомендуется кешировать рассчитанные значения высот, особенно если их расчет требует ресурсов.

Ответ 18+ 🔞

А, ну вот, опять этот вечный вопрос про высоту ячеек, блядь! Как будто без этого жизнь не мила. Слушай сюда, я тебе сейчас на пальцах объясню, как эту хрень прикрутить, чтобы всё летало, а не тормозило, как говно в проруби.

Значит, так, сука. Если ты хочешь впендюрить ячейке конкретную высоту, не надеясь на её внутренний контент, то тебе прямой путь в метод делегата tableView(_:heightForRowAt:). Ты там царь и бог, можешь выдать любую цифру, хоть 500 пикселей, если тебе так нравится.

Смотри, как это выглядит в коде, ёпта:

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    // Тут твоя логика, блядь. Можешь городить что угодно.
    switch indexPath.section {
    case 0:
        return 44.0 // Классика, жанра, блядь
    case 1:
        // А тут, например, чередуем: то 60, то 80, чтоб веселее было, как зебра, сука
        return indexPath.row % 2 == 0 ? 60.0 : 80.0
    default:
        // А на остальное похуй, пусть система сама думает
        return UITableView.automaticDimension
    }
}

Теперь, чтобы ты не запутался, какую хуйню когда использовать, держи табличку:

Подход Что за метод Когда впендюривать
Жёстко задаём tableView(_:heightForRowAt:) Когда ты ЗНАЕШЬ, сколько надо. Высота фиксированная или простая формула. Будет летать, как угорелый.
Автоматическая магия estimatedRowHeight + automaticDimension + Auto Layout в ячейке Когда внутри ячейки — пиздец какой динамический контент, который сам решает, какой он высоты. Может подтормаживать, если накосячить с констрейнтами.

О, важный момент, блядь! Допустим, ты поменял данные внутри ячейки (например, текст развернулся), и надо, чтобы высота плавно изменилась. Как быть? Не перезагружать же всю таблицу, ёб твою мать!

Вот правильный заход:

// 1. Ты там внутри поменял что-то, что влияет на высоту.
// 2. Говоришь таблице: "Слушай, пацан, пересчитайся, но красиво".
tableView.beginUpdates()
tableView.endUpdates()
// После этого система дёрнет heightForRowAt для видимых ячеек, и всё анимируется плавненько.

И последнее, на посошок. Если у тебя в heightForRowAt какая-то тяжёлая логика (например, ты там строки меряешь или картинки скачиваешь, мудак), то ОБЯЗАТЕЛЬНО кешируй результат, блядь! Не вычисляй одно и то же по сто раз. Засунь высоты в словарик и оттуда тащи. Иначе производительность будет — волнение ебать, терпения ноль ебать.