gpt4 book ai didi

ios - “scrollViewDidScroll”不连续捕捉运动

转载 作者:行者123 更新时间:2023-12-01 16:02:56 32 4
gpt4 key购买 nike

我正在编写程序以在滚动 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 时,这非常有效。但是,如果我非常快速地滚动 tableview,'myview' 将在到达顶部边缘之前停止。这是日志显示的内容:
right new_y: 56.0
bad new_y : -92.5
bad new_y : -153.5
bad new_y : -206.0

似乎委托(delegate)方法 scrollViewDidScroll没有捕捉到导致值(value)跳跃的每一个滚动运动。

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

最佳答案

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

刷新率

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

如果您的手指在该时间段内比下一个 scrollViewDidScroll 移动的速度快于 0.5 个显示点委托(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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com