2009-07-13 104 views
14

当您在iPhone触摸屏上拖动手指时,它会以一个不错的常规60Hz生成touchesMoved事件。什么时候触碰开始成为touchesMoved?

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

它还在等什么?更大的时间/距离增量?更多涉及到事件?

有人知道吗?

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

要看到这个bug /现象在行动

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

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

  3. 尝试双虚拟游戏杆游戏&请注意,效果会减轻,因为您必须永远不要结束分配不愉快的触摸。

本应该在8个月前将其记录为bug。

回答

0

它正在等待第一步。 这就是操作系统区分拖放和水龙头的方式。一旦你拖动,所有新的通知touchesMoved。

这也是为什么你应该编写代码来执行touch up事件的原因。

+0

我很好奇什么构成“第一招”。你的观点“所有新的通知在拖动后都会触动移动”是错误的:如果你用不同的手指点击,你当然会得到一个touchesBegan事件。然而,这些进一步的触动似乎过渡了更快接触移动事件。好奇。回复:“接触”事件建议,我正在实施一些比平均按钮或复选框更有触感的东西,这样就不会削减它。 – 2009-07-15 22:28:26

+0

我可以证实这一点。这在iPhone OS中是一个非常大的问题。 – Thanks 2009-11-18 11:42:44

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

+0

我已经这样做了。对于良好的移动,第一个“移动”可能比后续移动的对慢得多。尝试绘制一些连接的线段。第一部分应该更长。差别是微妙的,我认为我的应用程序正在放大效果(它模拟转盘)。除非有较低级别的界面,否则我只需将影响降至最低。 – 2009-07-16 13:00:36

+1

是的我正在使用一些内插和外推的网络效果(缓解点之间和一些预测)。但在本地你可能也需要这个。这取决于你的应用程序,但要记住,它仍然是一个缓慢的处理器和一台旧电脑真的如此,如果你有很多的图形和事件会有延迟。 – 2009-07-16 13:59:12

+0

对我而言,这种行为是一个错误,所以我会记录下来。我的应用程序自然会平滑不连续性,但它当然会受益于来自UIKit的更高质量的多点触控输入。 – 2010-04-14 10:06:30

1

我不代表任何官方的回答,但它使该touchesBegan-> touchesMoved比touchesMoved-> touchesMoved一个持续时间较长的意义。如果每个touchesBegan都带来一堆意外触摸移动事件,开发人员会感到沮丧。苹果公司必须确定(实验性)触摸变成拖曳的一段距离。一旦touchesMoved已经开始,没有必要再执行这个测试,因为直到下一个touchesUp的每个点都保证是touchesMoved。

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

0

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

2

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

通常情况下,这是用于过滤掉意外的微动作,当用户不打算使用这种意外微动时,会将水龙头或长按压转换为幻灯片。

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

缺少的功能是它看起来不可配置。

一个想法:是否有可能在touchesBegan上输入定时循环,定期检查触摸的locationInView:

相关问题