ios - “scrollViewDidScroll”无法连续捕获移动

标签 ios uitableview uiscrollview

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

enter image description here enter image description here

“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                                    
}

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

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

委托(delegate)方法 scrollViewDidScroll 似乎没有捕获导致值跳转的每个滚动移动。

我想知道原因以及如何解决,谢谢!

最佳答案

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

刷新率

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

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

解决方案

我建议将结果“限制”在您的预期范围内,而不是直接使用委托(delegate)方法中的值。在这种情况下,您似乎不想收到负数。这意味着如果您希望原点 y 值至少为 0,那么您应该从委托(delegate)中获取该值,如果它小于 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                                    
}

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

关于ios - “scrollViewDidScroll”无法连续捕获移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39482753/

相关文章:

ios - 当用户在 iOS 中拍照时,如何放置一种引导蒙版?

ios - Swift/IOS 重置 CollectionViewCell 中的 ImageView 缩放

ios - 如何在具有多个图像的 ScrollView 中放置一个 PageControl?

objective-c - objective-c : Go Back to Page 1 Button

objective-c - 如何在特定帧中将 UIView 捕获为 UIImage?

ios - GA 事件跟踪中的动态标签名称?

ios - 从新添加的地址簿对象获取 ABRecordID ios

ios - 将参数从函数传递给 prepareForSegue

ios - 如何从表格 View 行单元格中删除单独的行?

iOS - 表格 View - 静态单元格(分组) - 更改节标题文本颜色