【问题标题】:'scrollViewDidScroll' does not catch movement continuously“scrollViewDidScroll”不连续捕捉运动
【发布时间】:2016-09-14 04:57:47
【问题描述】:

我正在编写程序以在滚动 UITableView 时移动名为“myView”的 UIView,请看下图:

“myView”会随着tableview的contentoffset的变化而改变它的'y-coordinate',我写的主要代码是:

func scrollViewDidScroll(scrollView: UIScrollView) {

        let off_y = scrollView.contentOffset.y
        let new_y = originalMyViewY - off_y

        if new_y <= 0 {
            print("bad new_y : \(new_y)")
            return
        }
        else {
            print("right new_y: \(new_y)")
        }

        var frame = self.myView.frame
        frame.origin.y = new_y
        self.myView.frame = frame                                    
}

当我以正常速度滚动 tableview 时,这非常有效。但是,如果我非常快速地滚动 tableview,'myview' 将在到达顶部边缘之前停止。这是日志显示的内容:

right new_y: 56.0
bad new_y : -92.5
bad new_y : -153.5
bad new_y : -206.0

似乎委托方法scrollViewDidScroll 没有捕捉到导致值跳转的每一个滚动移动。

我想知道原因和解决方法,谢谢!

【问题讨论】:

    标签: ios uitableview uiscrollview


    【解决方案1】:

    发生这种情况的可能原因是您的应用接收到的触摸发生的速度快于屏幕的刷新率。因此会错过某些中间滚动点。

    刷新率

    iOS 设备通常以每秒 60 赫兹或 60 帧的速度运行。这意味着每 1/60 秒或 0.016666 秒,屏幕和数字化仪将尝试刷新当前的触摸状态。

    如果您的手指在该时间段内移动速度超过 0.5 个显示点,则下一个 scrollViewDidScroll 委托方法将报告较新的位置,而不会报告中间位置。

    解决方案

    我建议不要直接使用委托方法中的值,而是将结果“钳制”在您的预期范围内。在这种情况下,您似乎不想收到负数。这意味着如果您希望原点 y 值至少为 0,那么您应该从委托中获取值,如果它小于 0,则将视图的原点设置为 0,否则使用您的计算结果。

    例子:

    func scrollViewDidScroll(scrollView: UIScrollView) {
    
        let off_y = scrollView.contentOffset.y
        var new_y = originalMyViewY - off_y // make this mutable so we can change it in the <= 0 block
    
        if new_y <= 0 {
            print("y is less than 0, clamp y origin to 0")
            new_y = 0
        }
        else {
            print("right new_y: \(new_y)")
        }
    
        var frame = self.myView.frame
        frame.origin.y = new_y
        self.myView.frame = frame                                    
    }
    

    注意:这不应导致您的视图大小调整跳跃,因为 scrollView 应该已经在接近屏幕刷新率时报告此 scrollViewDidScroll。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-20
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多