预测减速后 UIScrollView 中的静止偏移量

Posted

技术标签:

【中文标题】预测减速后 UIScrollView 中的静止偏移量【英文标题】:Predicting the resting offset in a UIScrollView after deceleration 【发布时间】:2009-10-30 18:35:13 【问题描述】:

我希望能够在轻弹手势后预测 UIScrollView 内的最终静止偏移。它不需要精确到像素,但要足够接近,以便用户不会察觉到差异(即,它不会移动得比他们习惯的少或多)。

我知道有人会问,所以:为什么?我在 UIScrollView 中有一个类似表格视图的菜单控件。我想让最顶部的菜单项完全显示并刷新到 UIScrollView 的顶部。 UIScrollView 的分页功能并不是我想要的,因为强烈的轻弹不会飞过多个视图边界。

处理正常的触摸事件很容易。在touchesEnded:withEvent: 上,我可以滚动到最近的完整菜单项。最困难的部分是减速。

减速度有两个常数,UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast。在 iPhone OS 3.0 中,它们的值为 0.998 和 0.990。我试图弄清楚 Apple 用来减缓移动速度的数学方法,但我一无所获。

如果我可以准确地预测最终的静止偏移量,那么在减速的早期,我可以简单地使用scrollRectToVisible:animated: 移动到一个偏移量,其中菜单项与视图边界的顶部齐平。

有数学倾向的人知道苹果在减速期间可能会做什么吗?我是否应该收集一堆减速事件,绘制它们并得出一些接近的东西?

【问题讨论】:

为什么不能使用 UITableView 呢? 哦,我明白了——您想在滚动完成后捕捉到最近的菜单项吗? 我会注意到,像这样捕捉到菜单项并不是标准的 ios 行为——破坏用户期望的行为(即使是像这样的微妙方式)可能会令人不快。跨度> 【参考方案1】:

在 iOS 5 中控制 UIScrollView 的 targetContentOffset

iOS5 UIScrollViewDelegate 有一个新方法:scrollViewWillEndDragging:withVelocity:targetContentOffset:

这完全符合你想要做的。

当滚动视图的值 pagingEnabled 属性为 YES。您的应用程序可以更改该值 targetContentOffset 参数调整滚动视图的位置 完成它的滚动动画。

iOS4 及更低版本的替代解决方案

UIScrollViewdecelerationRate 更改为UIScrollViewDecelerationFast,然后在scrollViewDidEndDecelerating 中移动到最近的“页面”。

快速减速使完全停止/滑过更自然/不那么讨厌。

【讨论】:

顺便说一句,现在是 2016 年,即使 pagingEnabled 设置为 YES/true,也会调用方法 scrollViewWillEndDragging:withVelocity:targetContentOffset: IS。这对于确定用户在抬起手指后,但在橡皮筋动画结束之前将登陆哪个页面非常有用。【参考方案2】:

您可以在 UIScrollView 减速时观察滚动速度,当速度低于某个值时,捕捉到最近的菜单项。

您可能希望实现UIScrollViewDelegate 方法scrollViewDidEndDragging:willDecelerate:scrollViewDidScroll:。当用户抬起手指完成滚动手势时,scrollViewDidEndDragging:willDecelerate: 将被调用。开始监视scrollViewDidScroll: 事件,并观察UIScrollView 的当前位置与其先前位置之间的增量,除以时间增量:

float velocity = (currentPosition - lastPosition) / (currentTime - lastTime);

当速度低于最小值时,在UIScrollView 上调用scrollRectToVisible:animated:

【讨论】:

这大概是我最终做的事情,但我仍然对更早地预测这一点的建议感兴趣。 通过更早的预测,您是否有可能获得明显更好的结果? 当然。我越早知道动画在哪里结束,动画就会越流畅。考虑:如果速度阈值为 0,我必须加快(或反转)滚动移动以捕捉。随着阈值的增加,这种影响越来越不明显。 如果阈值足够大,是否还足够准确?如果不是,请尝试使用二次而不是线性近似来估计它。 (即测量和预测加速度以及速度) @nornagon 和 Steve Madsen 你能帮我解决类似的问题吗? ***.com/questions/16731569/…【参考方案3】:

我无法发表评论(我想我需要 50 个代表),所以这不是一个完整的答案,但考虑到 0.998 和 0.990 的减速度值,我的直觉是它们只是将当前速度乘以每帧的减速度。

【讨论】:

以上是关于预测减速后 UIScrollView 中的静止偏移量的主要内容,如果未能解决你的问题,请参考以下文章

预测表视图滚动目标索引路径

停用 UIScrollView 减速

iOS中 : UIScrollView在导航控制器中的自动偏移的问题解决

IOS7:UINavigationController 中的 UIScrollView 偏移

UIScrollview 偏移问题

机电传动控制第四周作业