Я немного затруднен.Вот проблема, с которой я сейчас сталкиваюсь.
У меня есть collectionView, содержащий ячейку с динамическим размером.Этот сборный вид передается данным через разбитый на страницы API.Каждый раз, когда я перезагружаю новые данные, мое приложение зависает во время процесса reloadData и вычисления размеров ячейки.
Чтобы рассчитать хороший размер для каждой ячейки в зависимости от ее содержимого, я делаю следующее:
func collectionView(_ collectionView: UICollectionView,
layoutcollectionViewLayout:UICollectionViewLayout,
sizeForItemAt indexPath:IndexPath) -> CGSize {
let size: CGFloat
if traitCollection.userInterfaceIdiom == .phone {
size = floor((collectionView.frame.size.width))
} else {
size = floor(UIApplication.shared.statusBarOrientation.isLandscape ?
(collectionView.frame.size.width - 5.0 * Style.Size.Margin) / 4.0 :
(collectionView.frame.size.width - 4.0 * Style.Size.Margin) / 3.0)
}
// Instantiate my nib cell
let cell = MyCell()
// Set the width constraint for the cell
cell.widthConstraint?.constant = size
let item = dataSource[indexpath.row]
// Apply content to the cell
cell.update(item)
// Calculate the appropriate height for cell
let sizeCell = cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
return sizeCell
}
Как видите, я установил ограничение ширины для ячейки и применил следующий расчет:
cell.contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
Проблема в том, что этот процесс довольно долго останавливает приложение, когдаЯ запускаю reloadData из collectionView, делая прокрутку пользовательского интерфейса неприятной и нестабильной.Кажется, я не могу найти хороший способ плавной прокрутки для моего collectionView.Я действительно надеюсь, что есть способ улучшить взаимодействие с пользователем.
После добавления данных к моему источнику данных вы найдете псевдокод:
func collectionView(_ collectionView: UICollectionView,
willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
if indexPath.row >= dataSource.count - 10, !fetchingMoredata,
!dataSource.isEmpty {
fetchingMoreData = true
fetchMoreData()
}
}
func fetchMoreData () {
API.callToGetMoreData() { newdata
self.dataSource += newdata
DispatchQueue.main.async {
let contentOffset = self.collectionView.contentOffset
self.collectionView.reloadData()
self.collectionView.setContentOffset(contentOffset, animated: false)
self.fetchingMoreData = false
}
}
}
Если у вас есть какие-либоИдея, почему моя реализация вызывает такие зависания при вычислении reloadData / size, или как улучшить весь процесс, которому вы помогаете, или совет был бы очень кстати.
Если вы пропустите какую-либо информацию, я будуболее чем рад помочь с большей точностью.
Заранее спасибо.
Martin