如何在我自己的自定义视图中重现 iPhone UIScrollView 的轻弹滚动行为?
Posted
技术标签:
【中文标题】如何在我自己的自定义视图中重现 iPhone UIScrollView 的轻弹滚动行为?【英文标题】:How can I reproduce the flick-to-scroll behavior of the iPhone UIScrollView in my own custom view? 【发布时间】:2010-10-21 12:23:07 【问题描述】:我想重现 UIScrollView 的轻弹滚动行为,但我不想使用(或不能使用)该类。我能做什么?
【问题讨论】:
注意:问题是关于 OpenGL 视图 没错,在 my 的情况下,我正在考虑 OpenGL 视图。但是,请参阅下面我对 Roger Nolan 的回复——我认为也有许多有趣的非 OGL 案例。 【参考方案1】:好的,我已经通过实现我自己的捕捉 UIScrollView 动态的库来回答这个问题。
我的代码的有用之处在于它独立于坐标系、动画速率和您正在使用的特定 UI 类。它可以轻松嵌套在您选择的自定义视图类中。
iPhone 的默认轻弹滚动行为很有趣。如果您长时间按住手指并向各个方向移动,您会发现只有最后一个方向用于计算滚动运动。
但是,如果您尝试自己构建此代码,您会很快发现仅使用最后两个点来计算运动方向并不能解决问题。相反,我的代码保留了很短的触摸历史记录,并使用线性插值来确定在一小段时间之前触摸“会”在哪里。该插值点用作计算运动矢量的基础。这会带来非常愉快的互动。
代码在 github 上可用,这里:http://gist.github.com/100855。它是在 BSD 许可下发布的。
【讨论】:
您在提出问题后的 2 分钟内回答了自己的问题 - 使用了一些非常复杂的代码?代码很有趣,OK! 是的,我不知道这对于 Stack Overflow 来说是否符合犹太教规,但由于我发现我不是唯一一个在寻找它的人,我认为它会有所帮助吗?有更好的论坛吗?【参考方案2】:那么 UIScrollView 不适合你怎么办?那个类很灵活...
【讨论】:
我有一个游戏的 OpenGL 视图,我希望能够以类似于 UIScrollView 的方式控制视口...【参考方案3】:戴夫,我看到你已经用一些代码回答了你自己的问题,但是,设置以下内容并没有满足你的需要:
myScrollView.bounces = YES;
myScrollView.pagingEnabled = YES;
myScrollView.directionalLockEnabled = YES;
具体来说,听起来您重新实现了directionLockEnabled
。也许理解为什么你不能使用 UIScrollView 是更有趣的问题:-)
【讨论】:
见我上面的评论。我试图在 UIScrollView 不能去(或者至少不应该去)的上下文中重现这种行为。 (并且:我应该指出,我所做的与仅在滚动视图上设置一些属性不同。如果这是我需要做的 - 好吧,我会做所以。:-) ...我很感兴趣 ;-) 我试图在上面的回答中暗示它,但我想你想要更多细节?在我的例子中,滚动发生在我的 OpenGL 世界中的任意平面上。那就是:对于 FlickDynamics.m 来说,简单的 x/y 对我的调用代码来说实际上是在某个已知方向的平面上的坐标,我有一个直接的正交投影... 我遇到这些麻烦的原因是我的情况似乎不是唯一的。对于您的问题,我可以想到其他几个独特的答案,这些答案都是完全合法的,并且比我的实际答案简单得多。例如,“我想使用与 UIScrollView 默认接受的手势不同的手势,因为我的应用程序保留了单指拖动功能”或“我需要将滚动动画与游戏的帧速率同步”。希望这有助于设置上下文! :-)【参考方案4】:这很酷!我在一个应用程序中使用了它,其中我的可滚动视图是 1902-2037 范围内一天的图形数据,因此 UIScrollView 效率不高。
【讨论】:
以上是关于如何在我自己的自定义视图中重现 iPhone UIScrollView 的轻弹滚动行为?的主要内容,如果未能解决你的问题,请参考以下文章