Я использовал автоматический макет для динамического расчета размера ячейки collectionView.Некоторые ячейки используют размеры из повторно используемых ячеек, когда они впервые прокручиваются для просмотра порта.Поскольку я продолжаю прокручивать collectionView, они будут установлены на правильное значение.
В моем sizeForItemAt
у меня есть следующее:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if let cachedSize = cachedHeightForIndexPath[indexPath] {
return cachedSize
}
if let cell = collectionView.cellForItem(at: indexPath) {
cell.setNeedsLayout()
cell.layoutIfNeeded()
let size = cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
cachedHeightForIndexPath[indexPath] = size
print("value is \(size) for indexpath: \(indexPath)")
return size
}
return CGSize(width: ScreenSize.width, height: 0.0)
}
У меня есть три сеанса, с первым разделом высота всех ячеек теоретически равна 88, а все остальные разделы всевысота ячейки равна 104.
Изначально виден только первый раздел.Из консоли видно, что высота ячейки установлена на 88.0, как и ожидалось.Поскольку я прокручиваю до оставшихся разделов (первый раздел будет невидимым, а ячейки будут использоваться повторно), некоторые ячейки из второго раздела и третьего раздела используют значение 88.0 в качестве высоты ячеек при первой прокрутке для просмотра порта вместо 104Поскольку я продолжаю прокручивать, ячейка неправильного размера будет использовать 104 в качестве измерения.Как заставить все ячейки пересчитать высоту и не использовать высоту из старой ячейки.