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

ios - 'scrollViewDidScroll'不能连续捕捉运动-LMLPHP
ios - 'scrollViewDidScroll'不能连续捕捉运动-LMLPHP

“myView”将随着tableview的contentoffset的改变而改变其“y坐标”,我编写的主要代码是:

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时,这完美地工作。但是,如果我快速滚动表格视图,则“myview”将在到达顶部边缘之前停止。这是日志显示的内容:
right new_y: 56.0
bad new_y : -92.5
bad new_y : -153.5
bad new_y : -206.0

似乎委托方法scrollViewDidScroll并未捕获导致值跳跃的所有滚动动作。

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

最佳答案

发生这种情况的可能原因是因为您的应用接收的触摸发生的速度快于屏幕的刷新速度。因此,某些中间滚动点将丢失。

刷新率

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

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



我建议不要直接使用委托方法中的值,而建议将结果“钳位”到您期望的范围内。在这种情况下,您似乎不想收到负数。这意味着如果您希望原点y的值最小为0,则应从委托中获取该值,如果该值小于0,则将View的原点设置为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。

关于ios - 'scrollViewDidScroll'不能连续捕捉运动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39482753/

10-10 20:39