Swift - 如果项目滚动一点,UICollection 快速恢复

Posted

技术标签:

【中文标题】Swift - 如果项目滚动一点,UICollection 快速恢复【英文标题】:Swift - UICollection snap back too fast if item scrolled a little 【发布时间】:2019-03-13 15:55:20 【问题描述】:

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

这是我的捕捉代码

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

【问题讨论】:

您是否在使用实际手指作为输入“设备”的实际设备上对此进行了测试 - 如果您使用手指而不是鼠标可能会感觉更正确。 @luk2302 是的,我做到了,但它仍然快速恢复,看起来有点滞后,还请记住,我正在使用 UIScrollView.DecelerationRate.fast 我认为你可以通过更新 UICollectionViewFlowLayout 来更好地控制,这里是一个很好的例子:github.com/lukagabric/LGLinearFlow “是否可以忽略或禁用滚动,除非用户滑动到下一个项目并且不让滚动视图将其捕捉到同一个项目?” ...所以如果用户开始一个手势,比如到目前为止只拖动了一厘米,你是说你根本不希望它移动,根本没有给用户反馈他们的手势正在被识别吗?你说你根本不想识别拖动手势,而只需要滑动手势? @Rob 我的意思是如果用户拖动速度很快就会移动到另一个项目,我真的很喜欢添加滑动手势识别器的想法,如果我没有,我正在考虑它摆脱那个滞后的回弹 【参考方案1】:

因为您直接设置 contentOffset,所以它会反弹。相反,您应该调用 UIScrollViewMethod setContentOffset(_:animated:) 动画为真。如果您仍然不喜欢结果,请考虑改为实现 UICollectionLayout 方法targetContentOffsetForProposedContentOffset:withScrollingVelocity:,然后布局将自动对齐您返回的点。

【讨论】:

我在上面的相同代码中尝试了 setContentOffset(_:animated:) 它很奇怪,有时它会捕捉到项目的中心,有时它什么也不做,targetContentOffsetForProposedContentOffset:withScrollingVelocity:我使用了上面相同的代码但是返回偏移量并用collectionView替换每个scrollView,用collectionView.contentOffset替换targetContentOffset.pointee,但似乎我做错了什么,因为它什么也没做 您实现了与 targetContentOffsetForProposedContentOffset:withScrollingVelocity: 不同的 scrollViewWillEndDragging。在 scrollViewWillEndDragging 中,您手动设置偏移量且不设置动画。如果您在 targetContentOffsetForProposedContentOffset:withScrollingVelocity 中返回建议的偏移量:集合视图将减速并动画到您返回的位置。

以上是关于Swift - 如果项目滚动一点,UICollection 快速恢复的主要内容,如果未能解决你的问题,请参考以下文章

Swift:Xcode tableView 无限滚动

TableView 在 Swift 中使用重复的单元格项目继续向下滚动

iOS Swift:ScrollView 严格拖动

Swift 在可滚动列表中添加项目

如何在iOS swift中水平滚动图像

在 Swift 中使用 UIScrollView 进行无限循环滚动