我在通过 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。
只是要明确一点:我已经设置self.view.multipleTouchEnabled = YES
了我的viewDidLoad
方法。
关于第二次触摸的信息可用,提供第一次触摸动作
这次我做了一些与上面的例子非常相似的事情。我用拇指触摸屏幕,然后用食指触摸屏幕,同时保持拇指不动。当我的拇指碰到屏幕而不是我的食指时调用 TouchesBegan。现在我移动我的拇指,并调用 touchesMoved。不仅如此,event.allTouches 数组中还有两次触摸(是的,第二次触摸是我期望的位置)。这意味着系统知道我第二次触摸了屏幕,但没有通过视图控制器上的触摸处理方法通知我。
如何通知我第二次触摸的更改?
我真的希望能够在第二次触摸发生时对位置或状态的变化做出响应,而不是在第一次触摸也发生变化时做出响应。很多时候这不会是一个问题,因为很难改变一个触摸而不影响另一个,但我至少有一种情况可能是一个问题。我错过了一些明显的东西吗?有没有其他人注意到这种行为或有问题?
如果相关,我使用的是运行 iOS 5.1 的 iPhone 3GS。