我正在编写程序来在滚动 UITableView 时移动名为“myView”的 UIView,请看下面的图片:
“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
}
当我以正常速度滚动桌面视图时,这非常有效。但是,如果我非常快地滚动表格视图,“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
委托方法将报告较新的位置,并且从不报告中间位置。
Solution
我建议将结果“限制”在您的预期范围内,而不是直接使用委托方法中的值。在这种情况下,您似乎不想收到负数。这意味着如果您希望原点 y 值至少为 0,那么您应该从委托中获取该值,如果它小于 0,请将视图的原点设置为 0,否则使用您的计算结果。
Example:
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
}
Note:这不应该导致视图大小的跳跃调整,因为scrollView应该已经在接近屏幕刷新率的情况下报告了这个scrollViewDidScroll。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)