UIScrollView的减速率和速度的单位/尺寸是什么?

4
我正在尝试在用户放开手指后获取滚动UIScrollView的速度,以便在滚动视图的速度低于阈值速度时触发事件。Apple文档说明滚动视图的速度单位为“点”,我猜测这应该是每秒(pts/s),例如对于UIScrollView代理方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity :(CGPoint)velocity targetContentOffset :(inout CGPoint *)targetContentOffset
因此,我会假设滚动视图减速的单位为“每秒点数平方(pts/s^2)”,但事实似乎并非如此。
以下是一些示例参数,从一个滚动视图中提取出来,即当手势事件结束时(即当您抬起手指时)从方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView中提取:

(初始偏移量,目标偏移量,初始速度,最终速度,减速,经过时间)=

  • (364.0,2664.5,4.619940,0,0.998,3.068916)
  • (2595.5,3288.5,1.398724,0,0.998,2.485449)
  • (3094.5,1907.0,-2.389578,0,0.998,2.752163)
  • (143.0,1275.5,2.279252,0,0.998,2.718653)
其中:
  • 初始偏移 = scrollView.contentOffset.y一旦抬起手指
  • 目标偏移量= targetContentOffset->y,一旦放开手指或scrollView.contentOffset.y当滚动视图停止减速时
  • 初始速度 = 一旦手指离开,velocity.y即可
  • 最终速度 = 0,因为让滚动视图自然滚动直到停止
  • 减速度= scrollView.decelerationRate一旦手指离开
  • 经过时间= 手指离开和滚动视图停止之间的时间

我无法真正回答这个问题,但我有两点观察:1)速度不可能以pts/s为单位。如果是这样的话,在您的第一次测量中,即使完全没有减速(每秒4.6个点实在太慢了),从初始偏移量到目标位置也需要超过8分钟的时间。2)decelerationRate属性不会因手势而改变。如果您没有在某个时刻明确设置它,它将始终保持为常量UIScrollViewDecelerationRateNormal0.998),就像您所有的测量结果中一样。 - omz
2个回答

4
你的目的中最重要的委托方法可能是scrollViewDidScroll:,因为你会一遍又一遍地收到这个消息,包括减速期间。监视正在发生的事情对你来说将更有用,而不是试图提前计算。没有有用的“滚动视图减速单位” - 也就是说,你没有任何信息可以让你提前计算减速期间每个时刻的速度。然而,scrollViewWillEndDragging:withVelocity:targetContentOffset:告诉你现在的速度和当速度为零时滚动视图将具有的偏移量,并且你可以立即请求偏移量,因此你可以在当前偏移量和最终偏移量之间决定一个偏移量,并在scrollViewDidScroll:中监视其余的滚动过程,以了解何时通过该偏移量。当然,每次调用scrollViewDidScroll:时都可以取一个时间戳,因此加上瞬时偏移量以及所有先前调用的记录,即可得到瞬时速度。

6
谢谢!另外,事实证明,速度(显而易见地)并不是每秒点数,而是每迭代点数。情况是这样的:每 X 秒,滚动视图将向前移动 Y 点,其中 X = 1/(每秒迭代次数),而 Y 则通过 scrollViewWillEndDragging:withVelocity:targetContentOffset: 方法中的参数 "velocity" 获得。X 秒后,滚动视图将向前移动 Y*Z 像素,其中 Z = scrollview.decelerationRate。这将持续到滚动视图停止。 - Ken M. Haggerty
@KenHaggerty 非常有用。感谢你找出来! - matt
1
IRC!irc.freenode.net #iphonedev。你只需要忍受别人的嘲讽和说你愚蠢和毫无价值,但最终你会得到答案。 - Ken M. Haggerty
@KenHaggerty 这很有趣,因为头文件注释说速度是点/秒。鉴于我观察到的数字的数量级,我无法理解点/秒是如何有意义的,因此我倾向于相信您的解释并假设该注释是错误的。 - Rob Jones
@KenHaggerty 您所说的“每秒迭代次数”是什么意思?此外,您将点和像素区分开来是否是故意的? - Rob Jones
我知道这是一个旧的讨论,但平均迭代速率是多少? - Travis Griggs

0

UIScrollView 的速度单位是以 pt/ms 为单位,而 UIPanGestureRecognizer 的速度单位则是以 pt/s 为单位。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接