像滚动一样的 UIScrollView 是如何工作的?

Posted

技术标签:

【中文标题】像滚动一样的 UIScrollView 是如何工作的?【英文标题】:How does UIScrollView like scrolling work? 【发布时间】:2010-12-09 11:00:53 【问题描述】:

在我看来,iPhone 比其他智能手机有很大的优势,因为它在 UIKit 中具有直观、流畅和感觉良好的滚动组件。我想用 UIKit 实现一个使用这种滚动的简单游戏,但我不能使用 UIScrollView,因为它的可定制性不够。

我尝试自己实现这种滚动并尝试了两种不同的方法:

    我使用了 UIPanGestureRecognizer 并根据识别器提供给我的翻译移动了自定义控件的边界。为了在移动过程中抬起手指后获得平滑滚动,我开始制作动画。我使用识别器给我的速度和固定时间来计算我抬起手指后它应该滚动多远。我尝试了线性运动和缓动运动,但两者看起来都很奇怪。 (稍后会详细介绍)

    ​​>

    我使用 OnTouchMoved 和 OnTouchEnded 来实现滚动。在 OnTouchMove 中,我根据手指的移动移动边界。当手指移动时,我计算当前和最后一次触摸的位置和时间的差异,以便自己计算速度。当手指抬起时,我在 OnTouchEnded 中启动动画,就像在 1 中一样。但我使用的是我自己计算的速度。

这两种方法都没有给我想要的结果。抬起手指后,滚动不顺畅。速度曲线似乎有一个(急剧的)弯曲。

有人知道苹果是如何实现平滑滚动的吗?我目前的猜测是,我用两个非常接近的点进行插值是不准确的,并且没有考虑当前的加速度。

谢谢你的想法! 凯

【问题讨论】:

【参考方案1】:

为什么不在视图顶部添加 UIScrollView 作为句柄,而不显示内容。然后,您可以使用 UIScrollViewDelegate 方法来更新您对某些操作的真实视图。例如:如果您使用 scrollViewDidScroll: 捕获 UIScrollView 的滚动,您可以使用滚动视图的偏移量更新可见视图。您可以使用 scrollViewWillEndDragging: 开始同步主视图与滚动视图,并使用 scrollViewDidEndDecelerating 停止同步。

我使用相同的方法来滚动我的 Animix 应用程序的背景。它在底部有一个不可见的滚动视图,给用户一种可以左右拖动草来移动背景的感觉。

【讨论】:

以上是关于像滚动一样的 UIScrollView 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

如何像 UITableView 一样继承 UIScrollView?

在 UIScrollView 中缩放和滚动大图像

UIScrollView 像 pageControl 一样向上滚动显示

如何一键同时控制两个 UIScrollView?

如何在像 BBC 新闻应用一样的 UIScrollView 中添加“广告”?

UIScrollView(滚动试图)