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

我遇到了一个问题,通过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已按预期调用。 我移动我的拇指,并touchesMoved被调用。 然后,我将拇指从屏幕上抬起,touchesEnded被调用。 所有这一切都如预期,我把它作为一个控件的情况下,包括它 – 只是为了清楚,我的视图控制器正在接收触摸事件,我没有错过任何地方vc.view.userInteractionEnabled = YES

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

这是最有趣的一个。 比方说,我用我的拇指触摸屏幕(touchesBegan被称为),并保持在屏幕上。 然后我用食指触摸屏幕上的其他地方,同时把拇指放在同一个地方。 TouchesBegan没有被调用。 那么让我们说,我移动食指,同时保持我的拇指绝对静止(这可能是棘手的,但它是可能的)。 TouchesMoved不被调用。 然后,我举起食指离开屏幕。 TouchesEnded不被调用。 最后,我移动我的拇指和touchesMoved被调用。 然后,我从屏幕上抬起我的拇指,并调用touchesEnded。

只是要清楚:我已经在我的viewDidLoad方法中设置self.view.multipleTouchEnabled = YES

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

这一次我做了一些非常类似于上面的例子。 我用拇指触摸屏幕,然后用拇指按住屏幕。 TouchesBegan在我的拇指碰到屏幕时调用,但不是我的食指。 现在我移动我的拇指,并touchesMoved被称为。 不仅如此,在事件中还有两个触动.allTouches数组(是的,第二个触摸就是我所期望的)。 这意味着系统意识到我已经第二次触摸屏幕,但是我没有通过视图控制器上的触摸处理方法得到通知。

如何才能通知第二次触摸的变化?

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

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

好吧,我开始刻意重build我的项目,一次添加一个文件,我想我已经得到了它…

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

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