为什么UIViewController会触及Began,touchesMoved& touchesEnded只在两个触摸中的第一个开始,移动或结束时被调用?

时间:2012-08-25 13:56:36

标签: ios cocoa-touch touch

我遇到了通过UIViewController的touchesBegan / Moved / Ended方法处理多个触摸的问题。我也在cocos2d应用程序中看到相同的行为(使用ccTouchesBegan / Moved / Ended),所以我认为这个问题可以应用于iOS中的所有触摸处理。我已经把我正在使用的代码放在下面,然后是我看到的结果。

所有方法都在UIViewController子类上实现。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Began");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Moved");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Touches Ended");
    [self logTouchesFor: event];

    [super touchesEnded: touches withEvent: event];
}

-(void)logTouchesFor:(UIEvent *)event
{
    int count = 1;

    for (UITouch *touch in event.allTouches)
    {
        CGPoint location = [touch locationInView: self.view];

        NSLog(@"%d: (%.0f, %.0f)", count, location.x, location.y);
        count++;
    }
}

现在有趣的结果......

单次触动按预期工作

假设我用拇指触摸屏幕。我在输出窗口中看到touchesBegan已按预期调用。我移动我的拇指,触摸移动被调用。然后我将我的拇指从屏幕上抬起来,触摸着被叫。所有这一切都符合预期,我将其作为一个控制案例包含在问题中 - 只是为了清楚我的视图控制器正在接收触摸事件并且我没有错过任何地方的vc.view.userInteractionEnabled = YES

第二次触摸不会导致touchesBegan,touchesMoved或touchesEnded被调用

这是最有趣的一个。假设我用拇指触摸屏幕(touchesBegan被调用)并将其保持在屏幕上。然后我用食指触摸屏幕上的其他地方,同时将拇指放在同一个地方。没有调用TouchesBegan。然后让我说我动了食指同时保持我的拇指绝对静止(这可能很棘手,但有可能)。未调用TouchesMoved。然后,我将食指抬离屏幕。未调用TouchesEnded。最后,我移动我的拇指和touchesMoved被调用。然后我将我的拇指从屏幕上抬起来,触摸着Ended。

为了清楚起见:我已在我的self.view.multipleTouchEnabled = YES方法中设置了viewDidLoad

有关第二次触摸的信息可用,提供第一次触摸移动

这次我做的事与上面的例子很相似。我用拇指触摸屏幕,然后食指,同时保持拇指不动。当我的拇指击中屏幕而不是我的食指时,会调用TouchesBegan。现在我移动我的拇指,并调用touchesMoved。不仅如此,在event.allTouches数组中有两个触摸(是的,第二次触摸是我期望它的位置)。这意味着系统意识到我第二次触摸了屏幕,但是我没有通过视图控制器上的触摸处理方法收到通知。

如何通知第二次触摸更改?

我真的希望能够在第二次触摸发生时响应第二次触摸的位置或状态的变化,而不是在第一次触摸也发生变化时。很多时候这不会是一个问题,因为很难改变一个触摸而不影响另一个,但我至少有一种情况可能是一个问题。我错过了一些明显的东西吗是否有其他人注意到这种行为或有问题?

如果相关,我正在使用运行iOS 5.1的iPhone 3GS。

1 个答案:

答案 0 :(得分:11)

好的,我开始煞费苦心地重建我的项目,一次添加一个文件,我想我已经得到了它......

有一个问题的子视图有userInteractionEnabled == YES。一旦我将其设置为NO,我的视图控制器就开始为每次触摸获取touchesBegan / Moved / Ended调用。据推测,第二次触摸是由子视图声明的,而不是我的视图控制器,但我不知道为什么这只会发生在第二次触摸而不是第一次触摸。

我还没有弄清楚cocos2d项目发生了什么,但可能是一个不同的问题,因为没有子视图或节点可以做同样的事情。