Почему изображения в UITableView прыгают при скроллинге и как это исправить?

«Почему изображения в UITableView прыгают при скроллинге и как это исправить?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Причина: "Прыжки" возникают из-за асинхронной загрузки изображений и изменения размера ячейки (UITableViewCell) после загрузки контента.

Решения:

  1. Фиксированный размер ячейки: Укажите точную высоту, чтобы система не пересчитывала layout.

    tableView.rowHeight = 120
    tableView.estimatedRowHeight = 120 // Убирает "ленивую" подгонку
  2. Использование placeholder'а: Заполните UIImageView изображением-заглушкой того же размера до загрузки.

    cell.myImageView.image = UIImage(named: "placeholder") // Заглушка 120x120
    loadImage(from: url) { downloadedImage in
        DispatchQueue.main.async {
            // Замена происходит без изменения frame
            cell.myImageView.image = downloadedImage
        }
    }
  3. Предварительный расчет высоты: Если размеры изображений известны заранее, рассчитайте и сохраните высоту ячейки в модели данных до отображения.

  4. Использование специализированных библиотек: Библиотеки вроде Kingfisher или SDWebImage решают эту проблему "из коробки", кэшируя изображения и корректно обновляя ячейки.

  5. Принудительное обновление layout: Если контент динамический, обновите layout после загрузки.

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cell.layoutIfNeeded()
    }