我有点困境。 这是我目前面临的问题。
我有一个collectionView包含动态大小的单元格。 此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)
问题在于,当我启动collectionView的reloadData时,此过程会使应用程序冻结相当长的一段时间,从而使UI滚动体验不愉快且不连贯。 我似乎没有找到一种使我的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 /大小计算期间导致这些冻结,或者如何改善整个过程,对您有所帮助,或者非常欢迎您提出建议。
如果您缺少任何信息,我们将非常乐意为您提供更高的精度。
谢谢。
马丁