4

我认为这个问题值得提出自己的问题。使用附加到我的另一个问题的解决方案的代码,我发现了此处描述的问题。

我将主视图控制器设置为 UIGestureRecognizerDelegate,并且我实现了touchesBegantouchesMovedtouchesEnded,并对touchesCancelled我的解决方案进行了编程,假设对于每个带有事件的触摸对象,同一个对象touchesBegan都会有一个touchesEndedtouchesCancelled事件。不过,我发现情况并非如此。

场景:以下事件按此顺序发生。

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

  • 用户开始手势 2,在不同位置触摸屏幕。

  • 用户继续在屏幕的相应部分滑动两个手指。

  • 用户将手指从屏幕上抬起以执行手势 2。

  • 用户继续手势 1。

  • 用户将手指从屏幕上抬起以执行手势 1。

使用NSLog捕获触摸事件的细节,我发现手势1和手势2使用了一个单独的触摸对象。但是手势1都调用了while touchesBegan、、touchesMoved和,而手势2只调用了和。事件不是要求它。touchesEndedtouchesBegantouchesMovedtouchesCancelled

touchesEnded那么,如果touchesCancelled没有调用手势 2,我如何判断手势 2 何时结束?

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

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

4

2 回答 2

0

你把这样的东西放在你的 touchesMoved 方法中怎么样

-(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];
}

touchesFinishedWithoutCallback: 方法只会在 touchesMoved停止被调用时被调用。

需要详细说明多点触控,但可以作为解决方案吗?

于 2012-12-18T21:00:15.090 回答
0

我最初的假设是,每次触摸都有自己的对象,该对象以 or 开头touchesBegan和结尾,touchesEnded或者touchesCancelled我认为是正确的。无论如何,它与我当前的实现有关。我最初没有看到第二次触摸,因为没有为我正在使用的视图启用多点触摸。根据评论中的建议,我启用了该功能。在那之后,我能够看到第二次触摸的一些,但不是所有的触摸事件。我有时看不到第二次触摸的原因是因为我有一个启用了用户交互的子视图。显然,它在控制触摸。我取消选中它,然后能够看到触摸对象。

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

于 2012-12-22T04:06:30.970 回答