将 scrollViewWillEndDragging 中的 targetContentOffset 更新为错误方向的值不会设置动画

Posted

技术标签:

【中文标题】将 scrollViewWillEndDragging 中的 targetContentOffset 更新为错误方向的值不会设置动画【英文标题】:Updating targetContentOffset in scrollViewWillEndDragging to a value in wrong direction does not animate 【发布时间】:2017-06-15 09:01:33 【问题描述】:

我正在为scrollViewWillEndDragging(_:withVelocity:targetContentOffset:) 中的targetContentOffset 设置一个新值,以在UITableView 中创建自定义分页解决方案。当为targetContentOffset 设置与速度指向的滚动方向相同的坐标时,它可以按预期工作。

但是,当以与速度相反的方向“向后”捕捉时,它会立即“向后捕捉”而没有动画。这看起来很糟糕。关于如何解决这个问题的任何想法。

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) 
    // a lot of caluculations to detemine where to "snap scroll" to
    if shouldSnapScrollUpFromSpeed || shouldSnapScrollUpFromDistance 
        targetContentOffset.pointee.y = -scrollView.frame.height
     else if shouldSnapScrollDownFromSpeed || shouldSnapScrollDownFromDistance 
        targetContentOffset.pointee.y = -detailViewHeaderHeight
    

我可以潜在地计算出这个“错误”何时会出现,并可能使用另一种“快速滚动”方式。有关如何执行此操作或正常使用targetContentOffset.pointee.y 解决此问题的任何建议?

【问题讨论】:

你的问题本身的标题拯救了我的一天。非常感谢你。我无法让自己在什么情况下动画会中断。就我而言,我将通过始终自动滚动到“正确”方向来修复它。再次感谢! 【参考方案1】:

我找到了一个不错的解决方案(或解决方法)。如果有人有更好的解决方案,请告诉我。

我刚刚检测到何时会出现不需要的“非动画快照滚动”,然后我没有将新值设置为 targetContentOffset.pointee.y,而是将其设置为当前偏移值(停止它)并使用改为滚动视图setContentOffset(_:animated:)

if willSnapScrollBackWithoutAnimation 
    targetContentOffset.pointee.y = -scrollView.frame.height+yOffset //Stop the scrolling
    shouldSetTargetYOffsetDirectly = false


if let newTargetYOffset = newTargetYOffset 
    if shouldSetTargetYOffsetDirectly 
        targetContentOffset.pointee.y = newTargetYOffset
     else 
        var newContentOffset = scrollView.contentOffset
        newContentOffset.y = newTargetYOffset
        scrollView.setContentOffset(newContentOffset, animated: true)
    

【讨论】:

你是如何检测到willSnapScrollBackWithoutAnimation的? willSnapBackWithoutAnimation 设置为 true 当滚动处于可捕捉间隔(滚动的 yOffset)且速度低于所需值(使用 1.0)且速度不为 0 时。 @Sunkas 为什么不发布willSnapScrollBackWithoutAnimation 的实际代码而不是解释它? 好问题。应该这样做的。不幸的是,您无法再访问代码了。

以上是关于将 scrollViewWillEndDragging 中的 targetContentOffset 更新为错误方向的值不会设置动画的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式

sh 一个将生成CA的脚本,将CA导入到钥匙串中,然后它将创建一个证书并与CA签名,然后将其导入到

python怎么将0写入文件?

如何将CMD窗口背景改成透明?