我想能够预测最后的安息滑动手势后,一个UIScrollView内的偏移。 它并不需要是像素精确的,但足够接近,使用户不会感觉到差别(即它不会过分少动或超过它们被用来)。
我知道有人会问,那么:为什么呢? 我有一个UIScrollView内的表视图类似菜单控制。 我想使它使得最上面的菜单项得到充分的展示,并刷新到的UIScrollView的顶部。 UIScrollView的分页功能是不是很我想要的,因为一抖不飞了过去的看法边界的倍数。
处理正常的触摸事件是很容易的。 在touchesEnded:withEvent:
,我可以滚动到最近的完整的菜单项。 难的是减速。
有两个常量,减速度, UIScrollViewDecelerationRateNormal
和UIScrollViewDecelerationRateFast
。 它们的值是0.998和0.990的iPhone OS 3.0。 我曾试图弄清楚,苹果使用慢运动的数学,但我来了空。
如果我能有一定的准确性最后的安息偏移预测,然后在减速过程中的早期,我可以简单地使用scrollRectToVisible:animated:
移动到一个菜单项到视图边界的顶部齐平偏移。
做任何数学倾斜人们知道苹果有可能在减速过程中在做什么? 我应该收集了一堆减速事件的数字,图形他们拿出了接近?
控制UIScrollView的targetContentOffset iOS 5中
iOS5的UIScrollViewDelegate
有一个新方法: scrollViewWillEndDragging:withVelocity:targetContentOffset:
这与你想要做什么完全适合。
这种方法不叫当滚动视图pagingEnabled属性的值是YES。 应用程序可以改变targetContentOffset参数进行调整,其中滚动视图完成其滚动动画的价值。
为iOS4的和较低的替代解决方案
变化UIScrollView
的decelerationRate
到UIScrollViewDecelerationFast
,然后在scrollViewDidEndDecelerating
移动到最近的‘页’。
快速减速使完全停止/滑过多一点自然/更少讨厌。
You could watch the speed of scrolling while the UIScrollView is decelerating, and when the speed falls beneath a certain value, snap to the nearest menu item.
You will likely want to implement the UIScrollViewDelegate
methods scrollViewDidEndDragging:willDecelerate:
and scrollViewDidScroll:
. When the user lifts their finger to finish a scroll gesture, scrollViewDidEndDragging:willDecelerate:
will be called. Begin monitoring the scrollViewDidScroll:
events, and watch the delta between the UIScrollView
's current position and its previous position, divided by the time delta:
float velocity = (currentPosition - lastPosition) / (currentTime - lastTime);
When the velocity falls below a minimum value, call scrollRectToVisible:animated:
on the UIScrollView
.
我不能评论(我想我需要50声望),所以这不是一个完整的答案,但减速给出的0.998至0.990值,我的直觉是,他们根本乘以减速率每帧当前速度。