我有一个与我的CollectionView大小相同的collectionView Cell,即屏幕上一次显示一个Cell,我想要在单元格之间最小间隔10,问题是当我滚动单元格时,单元格不是&# 39; t适合整个屏幕,每次滚动后细胞的移动都会增加。 (查看截图以便更好地理解)
答案 0 :(得分:1)
原因是您在设置单元格宽度时未采用minimum separation of 10
(320)。因此,每次滚动时都会累积10
。
因此在设置宽度时你必须减去320中的10个,所以宽度应该是310 IMO。
答案 1 :(得分:1)
我假设你为集合视图设置了pagingEnabled
。它从UIScrollView
继承此属性(因为UICollectionView
是UIScrollView
的子类)。
问题是集合视图使用自己的宽度(帖子中的320个点)作为页面的宽度。您的每个单元格与集合视图的宽度相同,但是在单元格之间有10个“沟槽”。这意味着从单元格0的左边缘到单元格1的左边缘的距离是320 + 10 = 330点。因此,当您滚动显示单元格1时,集合视图将停止在偏移320(自己的宽度)处滚动,但单元格1实际上从偏移330处开始。
最简单的修复可能是关闭pagingEnabled
并通过覆盖集合视图委托中的scrollViewWillEndDragging(_:withVelocity:targetContentOffset:)
来实现分页,如下所示:
override func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { return }
let pageWidth = scrollView.bounds.size.width + flowLayout.minimumInteritemSpacing
let currentPageNumber = round(scrollView.contentOffset.x / pageWidth)
let maxPageNumber = CGFloat(collectionView?.numberOfItems(inSection: 0) ?? 0)
// Don't turn more than one more page when decelerating, and don't go beyond the first or last page.
var pageNumber = round(targetContentOffset.pointee.x / pageWidth)
pageNumber = max(0, currentPageNumber - 1, pageNumber)
pageNumber = min(maxPageNumber, currentPageNumber + 1, pageNumber)
targetContentOffset.pointee.x = pageNumber * pageWidth
}
您还需要设置项目大小以匹配设备屏幕大小,并将减速率设置为快速:
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
guard let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout, let collectionView = collectionView else { return }
flowLayout.itemSize = collectionView.bounds.size
collectionView.decelerationRate = UIScrollViewDecelerationRateFast
}
结果: