【问题标题】:Units / Dimensions for UIScrollView decelerationRate and velocity?UIScrollView decelerationRate 和速度的单位/尺寸?
【发布时间】:2013-04-15 20:13:40
【问题描述】:

我试图在用户抬起手指后获取滚动 UIScrollView 的速度,以便在滚动视图的速度降至阈值速度以下时触发事件。

Apple 文档指出,滚动视图的速度单位为 points,我猜这将是每秒 (pts/s),例如,对于 UIScrollView Delegate 方法 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset

因此我会假设滚动视图的减速单位是points per second per second (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,因为让滚动视图滚动直到它自然停止
  • Deceleration = scrollView.decelerationRate 手指一抬起
  • 经过的时间 = 从手指抬起到滚动视图停止之间的时间

【问题讨论】:

  • 我无法真正回答这个问题,但我有两点意见:1)速度不可能以 pts/s 为单位。如果是这种情况,即使完全没有减速(每秒 4.6 点非常慢),从初始偏移到目标的第一次测量需要 8 多分钟 . 2) decelerationRate 属性永远不会响应手势而改变,如果你没有在某个时候明确设置它,它将始终是常量 UIScrollViewDecelerationRateNormal (0.998),就像在你所有的测量中一样。跨度>

标签: objective-c cocoa-touch uiscrollview uiscrollviewdelegate


【解决方案1】:

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

【讨论】:

  • 谢谢!此外,事实证明速度(很明显)不是 每秒点数,而是每次迭代的点数。发生的情况是,滚动视图每 X 秒前进 Y 个点,而 X 秒后它前进 Y*Z 像素数,其中 Z = scrollview.decelerationRate,Y = “速度”(如通过 scrollViewWillEndDragging:withVelocity:targetContentOffset:),并且X = 1/(每秒迭代次数)。这一直持续到滚动视图停止。
  • @KenHaggerty 非常有用。感谢您解决这个问题!
  • IRC! irc.freenode.net #iphonedev。你只需要忍受恶作剧和人们说你愚蠢和一文不值,但最终你会得到答案。
  • @KenHaggerty 这很有趣,因为头文件注释说速度是点/秒。鉴于我观察到的数字的大小,我看不出点/秒的意义,所以我倾向于相信你的解释并假设评论是错误的。
  • @KenHaggerty “每秒迭代次数”是什么意思?另外,您是否有意区分点和像素?
【解决方案2】:

UIScrollView 的速度单位以pt/ms 衡量,同时UIPanGestureRecognizer 的速度单位以pt/s 衡量

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多