touchesEnded或touchesCancelled并不总是被称为

时间:2012-12-18 20:03:53

标签: ios touch uigesturerecognizer

我认为这个问题值得回答。使用我的another problem解决方案附带的代码,我发现了此处描述的问题。

我将主视图控制器设置为UIGestureRecognizerDelegate,并实施touchesBegantouchesMovedtouchesEndedtouchesCancelled编程我的解决方案,假设每个触摸具有touchesBegan事件的对象,该同一对象会有touchesEndedtouchesCancelled事件。不过,我发现事实并非如此。

方案: 以下事件按此顺序发生。

  • 用户启动手势1,触摸屏幕并滑动手指。

  • 用户启动手势2,触摸不同位置的屏幕。

  • 用户继续将两根手指滑动到屏幕的各个部位。

  • 用户将手指从屏幕上抬起以获取手势2.

  • 用户继续手势1.

  • 用户将手指从屏幕上抬起以获取手势1.

使用NSLog捕获触摸事件的详细信息,我发现单独的触摸对象用于手势1和手势2.但是touchesBegantouchesMoved和{ {1}}全部为手势1调用,仅为手势2调用touchesEndedtouchesBegan。事件touchesMoved也未被调用。

那么,如果未调用touchesCancelledtouchesEnded,手势2何时结束呢?

编辑:我发现another post有类似的症状。但是,我的大多数子视图都是以编程方式创建的。我会尝试其他人的建议。我怀疑它是同一个问题,因为在我的测试中,触摸位置并不在其他视图附近。

另一个编辑:按照我之前编辑中发布的链接中的建议,我查看了子视图,并检查了一个用户交互。取消选中后,行为略有不同。现在,在任何触摸事件中都没有注意到第二次触摸。我必须遗漏一些基本的东西。顺便说一下,主视图和用户交互检查的视图占用相同的空间(一个封装了另一个)。

1 个答案:

答案 0 :(得分:0)

我最初的假设是,每次触摸都有自己的对象,从touchesBegan开始,以touchesEndedtouchesCancelled结束,我认为是正确的。无论如何,这是我目前的实施。我最初没有看到第二次触摸因为我正在使用的视图没有启用Multiple Touch。我根据评论中的建议启用了这个功能。在那之后,我能够看到第二次触摸的一些但不是所有触摸事件。我有时没有看到第二次触摸的原因是因为我有一个启用了用户交互的子视图。显然,它正在扼杀这些触动。我取消选中,然后能够看到触摸物体。

然后,我通过坐标切换跟踪触摸以触摸ID,并能够跟踪所有触摸的完整寿命。按坐标跟踪不起作用,因为我发现第二次触摸时,touchesEnded坐标与touchesMoved中的最后一个坐标相同,而不是touchesEnded中匹配touchLocation的前一个位置touchesMoved和第一次接触一样。如果这听起来令人困惑,只需通过触摸ID而非坐标来跟踪触摸。