预测减速后 UIScrollView 中的静止偏移
-
22-07-2019 - |
题
我希望能够预测轻弹手势后 UIScrollView 内的最终静止偏移量。它不需要是像素精确的,但足够接近,以便用户不会察觉到差异(即)它的移动不会比他们习惯的少或多)。
我知道有人会问,所以:为什么?我在 UIScrollView 中有一个类似表视图的菜单控件。我想让最顶部的菜单项完全显示并齐平到 UIScrollView 的顶部。UIScrollView 的分页功能并不完全是我想要的,因为强烈的轻拂不会飞过多个视图边界。
处理正常的触摸事件非常容易。在 touchesEnded:withEvent:
, ,我可以滚动到最近的完整菜单项。困难的部分是减速。
减速度有两个常数, UIScrollViewDecelerationRateNormal
和 UIScrollViewDecelerationRateFast
. 。在 iPhone OS 3.0 中,它们的值为 0.998 和 0.990。我试图找出苹果公司用来减缓移动速度的数学原理,但我一无所获。
如果我可以准确地预测最终的静止偏移,那么在减速初期我可以简单地使用 scrollRectToVisible:animated:
移动到菜单项与视图边界顶部齐平的偏移位置。
有数学爱好者知道苹果在减速期间可能会做什么吗?我是否应该收集大量减速事件,将它们绘制成图表并得出一些接近的结果?
解决方案
iOS 5 中控制 UIScrollView 的 targetContentOffset
iOS5 UIScrollViewDelegate
有一个新方法: scrollViewWillEndDragging:withVelocity:targetContentOffset:
.
这完全符合您想要做的事情。
当Scroll View的PagingEnabled属性的值是肯定的时,该方法不会调用。您的应用程序可以更改目标范围内存参数的值,以调整滚动浏览器完成其滚动动画的位置。
iOS4 及更低版本的替代解决方案
改变 UIScrollView
的 decelerationRate
到 UIScrollViewDecelerationFast
然后在 scrollViewDidEndDecelerating
移动到最近的“页面”。
快速减速使完全停止/滑行变得更自然/不那么令人讨厌。
其他提示
您可以在 UIScrollView 减速时观察滚动速度,当速度低于某个值时,捕捉到最近的菜单项。
您可能想要实施 UIScrollViewDelegate
方法 scrollViewDidEndDragging:willDecelerate:
和 scrollViewDidScroll:
. 。当用户抬起手指完成滚动手势时, scrollViewDidEndDragging:willDecelerate:
将被调用。开始监控 scrollViewDidScroll:
事件,并观察之间的增量 UIScrollView
的当前位置与其先前位置除以时间增量:
float velocity = (currentPosition - lastPosition) / (currentTime - lastTime);
当速度低于最小值时,调用 scrollRectToVisible:animated:
于 UIScrollView
.
我不能评论(我想我需要50声望),所以这不是一个完整的答案,但减速给出的0.998和0.990的价值观,我的直觉是,他们根本乘以减速率每帧当前速度。