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

时间:2009-10-30 18:35:13

标签: cocoa-touch uiscrollview

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

我知道有人会问,所以:为什么?我在UIScrollView中有一个类似于表视图的菜单控件。我想这样做,以便最顶层的菜单项完全显示并刷新到UIScrollView的顶部。 UIScrollView的分页功能并不是我想要的,因为强大的轻弹不会超过视图范围的倍数。

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

减速率UIScrollViewDecelerationRateNormalUIScrollViewDecelerationRateFast有两个常数。它们在iPhone OS 3.0中的值为0.998和0.990。我试图弄清楚苹果用来减缓运动的数学运算,但我是空的。

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

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

3 个答案:

答案 0 :(得分:15)

在iOS 5中控制UIScrollView的targetContentOffset

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

这完全符合你想要做的事情。

  

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

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

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

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

答案 1 :(得分:3)

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

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

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

当速度低于最低值时,请致电scrollRectToVisible:animated:上的UIScrollView

答案 2 :(得分:0)

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