Я делаю бесконечно прокручиваемый тикер и сталкиваюсь с этой проблемой, когда UICollectionView
будет вызывать sizeForItem
для каждой ячейки перед загрузкой.Я не понимаю, почему это будет сделано, поскольку в данный момент отображается только определенное число
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
print("sizeForItem\(Date())")
let height = collectionView.frame.height
guard tickerItems.count > 0 else {
return CGSize(width: 500, height: 250)
}
let tickerCell = collectionView.cellForItem(at: indexPath) as? TickerCell ?? TickerCell()
let tickerItem = tickerItems[indexPath.row % tickerItems.count]
let width = tickerCell.width(for: tickerItem)
return CGSize(width: width, height: height)
}
Некоторые вещи, которые мне приходили в голову: Может быть, я возвращаю действительно малую ширину?Нет, я проверил, они нормальные.Включена ли предварительная загрузка?Нет, я отключаю его.
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return tickerItems.count > 0 ? 100000 : 0
}
Даже если я отключу таймер, который управляет автоматической прокруткой, у меня все еще остается та же проблема. collectionView вычисляет размеры для каждого отдельного индекса, даже если этот индекс не отображается в течение длительного времени. т.е. он будет буквально вычислять индексы размеров 100 000, прежде чем окончательно разблокировать пользовательский интерфейс, загружающий collectionView.