У меня есть горизонтальная UICollectionView
, в которой я отображаю изображения, которые загружаются асинхронно.Ячейки должны иметь ширину, подходящую к изображению.
В viewDidLoad
моего контроллера представления я устанавливаю приблизительный размер ячейки:
(collectionView.collectionViewLayout as? UICollectionViewFlowLayout)?.estimatedItemSize = CGSize(width: 400, height: 400)
В cellForItem
, я запускаюзадача загрузки с использованием Kingfisher:
cell.imageView.kf.setImage(with: url) { (_, _, _, _) in
cell.layoutSubviews()
}
Внутри моей ячейки внутри метода layoutSubviews
есть следующий код:
// 326 is the image view's height
// .aspectRatio is a custom extension that returns: size.width / size.height
imageViewWidthConstraint.constant = 326 * image.aspectRatio
layoutIfNeeded()
В раскадровке я правильно настроил макетограничения, так что imageViewWidthConstraint
соблюдается для ширины ячейки.
Ниже приведен результат при запуске моего приложения:
Как видите, ячейки имеют ширину 400, хотя изображение было загружено, а макет обновлен.И, как результат, изображения растягиваются, чтобы заполнить представление изображения.
Когда я прокручиваю вправо и затем назад, ячейки удаляются из представления сбора и загружаются обратно, и теперь правильно выложены:
Во время прокрутки ячейки настраивают свою ширину, иногда на правильную ширину, иногда на неправильную.
Что я делаюздесь не так?