15

当您在 iPhone 触摸屏上拖动手指时,它touchesMoved会以正常的 60Hz 频率生成事件。

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

它还在等什么?更大的时间/距离增量?更多的接触融入活动?

有人知道吗?

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

要查看此错误/现象的实际效果

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

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

  3. 尝试双虚拟操纵杆游戏并注意效果会减轻,因为您必须永远不要结束任何一种可以消除不愉快的触摸。

应该在 8 个月前将其记录为错误。

4

5 回答 5

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

于 2009-07-16T12:28:25.883 回答
2

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

通常,这是为了过滤掉意外的微动作,这些动作会在用户无意中将点击或长按转换为幻灯片。

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

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

一个想法:是否可以进入定时循环touchesBegan,定期检查触摸locationInView:

于 2012-01-05T10:10:55.693 回答
1

我不代表任何形式的官方答案,但 touchesBegan->touchesMoved 的持续时间比 touchesMoved->touchesMoved 更长是有道理的。如果每次 touchesBegan 都伴随着一堆意外的 touchesMoved 事件,开发人员会很沮丧。苹果一定已经(通过实验)确定了触摸变成拖拽的距离。一旦 touchesMoved 开始,就不需要再执行这个测试了,因为直到下一次 touchesUp 之前的每个点都保证是一个 touchesMoved。

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

于 2009-07-20T19:19:09.810 回答
0

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

于 2011-01-24T23:01:01.637 回答
0

它在等待第一步。这就是操作系统区分拖动和点击的方式。拖动后,所有新通知都会被 touchesMoved。

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

于 2009-07-15T20:19:02.210 回答