【问题标题】:detect canceled scroll in scrollView with paging enabled在启用分页的情况下检测滚动视图中取消的滚动
【发布时间】:2020-07-21 02:56:18
【问题描述】:

我想检测用户何时滚动到下一页(在启用分页的 collectionView 中)。一旦用户开始滚动到下一个单元格,我就会使用collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 函数对其进行准备。在这里,我设置了一个变量,指示哪个将是下一个可见单元格。

然后,当用户停止拖动时,我使用scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) 函数运行视觉更新。此时我知道哪个单元格是可见的,因为我之前将它保存在变量中。

但是,当用户开始拖动collectionView,然后滚动回到起始视图时,collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) 已经保存了下一项。这会导致以下函数 (scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)) 运行不正确的代码(可视化更新)。

有没有办法知道用户何时取消或实际执行滚动到下一页,以便我可以阻止 scrollViewDidEndDragging 更新,除非滚动“成功”?

【问题讨论】:

    标签: ios swift uitableview uicollectionview uiscrollview


    【解决方案1】:

    解决方案是使用函数scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 并查看targetContentOffset 参数。如果在任一方向上都超过页面宽度的一半,则滚动成功。

    【讨论】:

      【解决方案2】:

      您可以从 didStartDragging 和 didEndDragging 比较滚动视图的 .contentOffset。 当且仅当 contentOffset 发生变化时,分页动画才成功

      【讨论】:

      • 不幸的是,即使在 didEndDragging 中更改了 contentOffset,如果滚动没有足够的速度(或向后方向的速度),collectionView 将返回到起始页面,因此滚动会有“失败”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多