在水平滚动后,CollectionView Cell将转移到右侧

时间:2017-04-14 13:51:07

标签: ios uicollectionview

我有一个与我的CollectionView大小相同的collectionView Cell,即屏幕上一次显示一个Cell,我想要在单元格之间最小间隔10,问题是当我滚动单元格时,单元格不是&# 39; t适合整个屏幕,每次滚动后细胞的移动都会增加。 (查看截图以便更好地理解)

This is 3rd cell

This is 6th cell

enter image description here

2 个答案:

答案 0 :(得分:1)

原因是您在设置单元格宽度时未采用minimum separation of 10(320)。因此,每次滚动时都会累积10

因此在设置宽度时你必须减去320中的10个,所以宽度应该是310 IMO。

答案 1 :(得分:1)

我假设你为集合视图设置了pagingEnabled。它从UIScrollView继承此属性(因为UICollectionViewUIScrollView的子类)。

问题是集合视图使用自己的宽度(帖子中的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
}

结果:

demo