Ответ
Высоту ячейки можно задать явно, реализовав метод делегата 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: рекомендуется кешировать рассчитанные значения высот, особенно если их расчет требует ресурсов.