touchesBegan什么时候成为touchesMoved?

时间:2009-07-13 23:12:09

标签: iphone uikit multi-touch

当您在iPhone触摸屏上拖动手指时,它会以漂亮的常规60Hz生成touchesMoved个事件。

但是,从初始touchesBegan事件到第一个touchesMoved的转换不太明显:有时设备会等待一段时间。

等待什么?更大的时间/距离增量?更多接触到这个事件?

有人知道吗?

重要,后续手指不会发生此延迟,这会使第一次触摸处于明显的劣势。对于需要精确输入的应用程序,如游戏和乐器,这是非常不对称和坏消息。

要查看此错误/现象

  1. 慢慢将iPhone屏幕解锁滑块向右拖动。注意突然跳跃&请注意如果您在屏幕上的其他任何地方放置另一根手指,它将如何发生

  2. 尝试在任意数量的3D游戏中穿过狭窄的桥梁“爬行”。令人沮丧!

  3. 尝试双虚拟操纵杆游戏&请注意,这种效果可以减轻,因为你不得不结束任何能够缓解不愉快的接触。

  4. 应该在8个月前将此记录为错误。

5 个答案:

答案 0 :(得分:4)

触发touchesBegan事件后,UIKit会查找手指触摸的位置移动,当手指的x / y改变时,手指触摸会转换为touchMoved事件,直到手指抬起并触发touchesEnded事件。

如果手指在一个地方被按住,它将不会触发touchesMoved事件,直到移动为止。

我正在构建一个你必须根据touchesMoved进行绘制的应用程序,它确实会间隔发生,但它足够快,可以提供平滑的绘图外观。由于它是一个事件并且隐藏在SDK中,您可能需要在您的场景中进行一些测试,以查看它响应的速度,具体取决于其可能根据其使用情况变化的其他操作或事件。根据我的经验,它在移动的几毫秒内,屏幕上大约有2-3k个其他精灵。

绘图确实从touchesBegan事件开始,但是第一个贴图设置然后它链接到touhesMoved并以touchesEnd结束。我使用所有事件进行拖动操作,因此在这种情况下,初始移动可能不那么迟钝。

要在您的应用中进行测试,您可以为每个事件添加时间戳,如果它对您的设计至关重要并且可以进行某种缓和。

http://developer.apple.com/IPhone/library/documentation/UIKit/Reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/touchesMoved:withEvent

答案 1 :(得分:2)

我认为这不是一个错误,它更像是一个缺失的功能。

通常情况下,这是一种过滤掉意外微动的行为,当用户不打算将其轻拍或长按到滑动时。

这并不是什么新鲜事,它一直存在,例如在基于指针的GUI中有双倍的单击容差像素 - 甚至在拖动开始之前都是相同的容差,因为用户有时会无意中拖动它们只是想点击。尝试慢慢移动桌面(OSX或Windows)上的项目以查看它。

缺少的功能是它似乎不可配置。

一个想法:是否可以在touchesBegan上输入定时检查触摸locationInView:的定时循环?

答案 2 :(得分:1)

我不代表任何官方答案,但有意义的是,touchesBegan-> touchesMoved的持续时间比touchesMoved-> touchesMoved更长。如果每一次接触都会带来一堆偶然的触动移动事件,对开发者来说将是令人沮丧的。 Apple必须(通过实验确定)触摸成为阻力的某个距离。一旦touchesMoved开始,就不再需要执行此测试,因为直到下一个touchesUp的每个点都保证是touchesMoved。

这似乎就是你在原帖中所说的,Rythmic Fistman,我只是想再说一点,并说我同意你的推理。这意味着如果您正在计算某种“拖动速度”,则需要使用行程距离作为因子,而不是取决于更新计时器的频率(无论如何这都是更好的做法)。

答案 3 :(得分:0)

等待第一步。 这就是操作系统如何区分拖拽拖拽。拖动后,所有新通知都是touchesMoved。

这也是您应该编写代码以在修饰事件上执行的原因。

答案 4 :(得分:0)

目前,当其他手指触摸屏幕时,touchesBegan和touchesMoved之间存在这样的“延迟”。不幸的是,似乎还没有禁用它的选项。我也是音乐应用程序开发人员(和播放器),我发现这种行为非常烦人。