2010-12-16 65 views
0

对于实验我有一个UIViewController和一个截取触摸事件的自定义窗口,这样我可以在屏幕上拖动和滑动不同的UIViews。我处理的事件类型有3种:UITouchPhaseBegan和UITouchPhaseMoving(其中我简单地根据触摸坐标移动子UIView)和UITouchPhaseEnded(其中我向UIView施加一个力让它在屏幕上移动,放慢速度摩擦)。UIScrollView如何在滚动/抖动的情况下滚动得如此之好?

我计算结束触摸事件时应用的力的方法是通过计算最后(来自UITouchPhaseMoving)和当前(来自UITouchPhaseEnded)触摸位置之间的方向矢量,但它似乎并没有给我我想要的结果。

当我移动视图并平稳地将手指从屏幕上抬起时,它会很好地移动,但是当我“移动”到最后时,它移动的距离并不像预期的那么远。这是因为即使我将它在屏幕上移动了几帧,最后的跳动使得最后和当前触摸事件的坐标太接近,所以我没有计算出全力。

对不起长文本,但我注意到像UIScrollView这样的视图仍然可以正确滚动,即使是这种干的/闪烁的运动;这是因为最终的力量是在多个帧上计算的,而不是仅仅是最后一帧和当前帧?如果是这样,是否有人知道滚动视图的内部工作原理,即使是轻快/抖动的运动,它也能够很好地工作?

回答

1

我不知道内部工作原理, ,但怀疑它通过记下触点坐标和时间以及释放坐标和时间来计算力矢量。一旦发生这种情况,对其进行减速,以获得惯性。我认为这可能是一件非常难以正确的事情,而且苹果已经花了很长时间对此进行了微调,甚至在达到其界限时反弹速度也很快。绝对是一个有趣的实验。