Swift-如果项目稍微滚动一下,UICollection会快速回退

时间:2019-03-13 15:55:21

标签: ios swift uiscrollview uicollectionview

我正在尝试使UICollectionView捕捉回到附近任何项目单元格的中心, 但是问题是,当我将其稍微移动一点时,它会迅速回弹到看起来不光滑的单元格中心, 是否可以忽略或禁用滚动,除非用户滑动到下一个项目并且不使scrollview将其捕捉为同一项目?

这是我要捕捉的代码

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    let layout = self.collectionView.collectionViewLayout as! UICollectionViewFlowLayout
    let cellWidthIncludingSpacing = layout.itemSize.width + layout.minimumLineSpacing
    var offset = targetContentOffset.pointee

    let index = (offset.x + scrollView.contentInset.left ) / cellWidthIncludingSpacing
    let roundedIndex = round(index)

    self.lastContentOffset = scrollView.contentOffset.x
    offset = CGPoint(x: roundedIndex * cellWidthIncludingSpacing - scrollView.contentInset.left, y: -scrollView.contentInset.top)

    targetContentOffset.pointee = offset


}

编辑: 这就是它从物理设备恢复的方式。 它在这里比较慢,因为它是gif

enter image description here

1 个答案:

答案 0 :(得分:0)

它会回弹,因为您直接设置了contentOffset。相反,您应该在动画为true的情况下调用UIScrollViewMethod setContentOffset(_:animated:)。如果您仍然不喜欢结果,则可以考虑实施UICollectionLayout方法targetContentOffsetForProposedContentOffset:withScrollingVelocity:,然后布局将自动对齐到您返回的位置。