我认为这个问题值得自己提出问题。使用附加到另一个问题的解决方案的代码,我发现了此处描述的问题。
我将主视图控制器设置为UIGestureRecognizerDelegate,我实现了touchesBegan
,touchesMoved
,touchesEnded
,并touchesCancelled
编程我的解决方案,假设对于每个具有touchesBegan
事件的触摸对象,同一对象都会有一个touchesEnded
或touchesCancelled
事件。不过,我发现情况并非如此。
场景: 以下事件按此顺序发生。
-
用户启动手势 1,触摸屏幕并滑动手指。
-
用户启动手势 2,在其他位置触摸屏幕。
-
用户继续在屏幕的相应部分滑动双指。
-
用户将手指从屏幕上抬起以显示手势 2。
-
用户继续手势 1。
-
用户将手指从屏幕上抬起以显示手势 1。
使用NSLog
捕获触摸事件的详细信息,我发现手势 1 和手势 2 使用了单独的触摸对象。但是,虽然手势 1 调用了touchesBegan
、touchesMoved
和touchesEnded
,但手势 2 只调用了touchesBegan
和touchesMoved
。事件touchesCancelled
也没有被调用。
那么,如果未调用touchesEnded
和touchesCancelled
,我如何判断手势 2 何时完成?
编辑:我发现了另一个具有类似症状的帖子。不过,我的大多数子视图都是以编程方式创建的。我会尝试那里为其他人提出的建议。不过,我怀疑这是同样的问题,因为在我的测试中,触摸位置与其他视图不接近。
另一个编辑:按照我之前编辑中发布的链接中的建议,我查看了子视图,其中一个检查了用户交互。取消选中后,行为略有不同。现在,在任何触摸事件中都不会注意到第二次触摸。我一定错过了一些基本的东西。顺便说一下,主视图和选中了用户交互的视图都占用相同的空间(一个封装另一个)。
我最初的假设是,每次触摸都有自己的对象,从touchesBegan
开始,以touchesEnded
或touchesCancelled
结束,我认为是正确的。无论如何,它与我当前的实现有关。我最初没有看到第二次触摸,因为未为我正在使用的视图启用多点触控。根据评论中的建议,我启用了它。在那之后,我能够看到第二次触摸的一些但不是全部触摸事件。我有时看不到第二次触摸的原因是因为我有一个启用了用户交互的子视图。显然,它正在征用触摸。我取消选中,然后能够看到触摸对象。
然后,我将按坐标跟踪触摸切换到触摸 ID,并能够跟踪所有触摸的完整生命周期。按坐标跟踪不起作用,因为我发现对于第二次触摸,touchesEnded
坐标与touchesMoved
中的最后一个相同,而不是与touchesEnded
中的先前位置相同,与第一次触摸一样与touchesMoved
中的触摸位置相匹配。如果这听起来令人困惑,只需通过触摸ID而不是坐标跟踪触摸即可。
你把这样的东西放在你的触摸中怎么样移动的方法
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
NSArray* touchData = @[touches,event];
[self.timer invalidate];
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self
selector:@selector(touchesFinishedWithoutCallback:) userInfo:touchData
repeats:NO];
[self.timer fire];
}
touchesDoneWithoutCallback: 方法只有在 touchesMove停止被调用时才会被调用。
需要详细说明多点触控,但可能是一个解决方案?