ios – 为什么UIViewController touchsBegan,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已经被调用了.我移动我的拇指,并触摸已被调用.然后我把我的拇指从屏幕上拉出来,然后触摸已被调用.所有这一切都是如预期的那样,我将它作为一个控制案例包含在这个问题中 – 只要清楚我的视图控制器正在接收触摸事件,并且我没有错过任何地方的vc.view.userInteractionEnabled = YES.

第二次触摸不会触发触发,触摸已触发或触摸已被调用

这是最有趣的一个.假设我用拇指触摸屏幕(touchesBegan被调用),并将其保持在屏幕上.然后我用食指触摸屏幕上的其他地方,同时把拇指放在同一个地方. touchesBegan不叫.然后让我说,我把食指放在绝对静止的位置(这可能是棘手的,但这是可能的).接触不被调用.然后,我把食指从屏幕上拉出来. touchesEnded不被调用.最后,我移动我的拇指和触摸被调用.然后我把我的拇指从屏幕上拉出来,并且触摸已被调用.

只是为了清楚:我在viewDidLoad方法中设置self.view.multipletouchEnabled = YES.

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

这一次我做了非常类似于上面的例子.我用拇指触摸屏幕,然后用食指,同时保持我的拇指静止.当我的拇指击中屏幕,而不是我的食指时,touchesBegan被调用.现在我移动我的拇指,触摸被调用.不仅如此,但事件中有两个触动.alltouches数组(是的,第二个触摸是我期望的地方).这意味着系统意识到我已经触摸屏幕第二次,但我没有通过我的视图控制器上的触摸处理方法通知.

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

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

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

解决方法

好的,我开始努力重建我的项目,一次添加一个文件,我想我已经有了…

一个视图的子视图有userInteractionEnabled == YES.一旦我设置为NO,我的视图控制器开始触摸每个触摸的按钮/移动/结束呼叫.大概,第二个触摸是被子视图声称,而不是让我的观点控制器,但我不知道为什么这只会发生在第二次触摸,而不是第一次.

我还没有想到cocos2d项目还在发生什么,但是推测这是一个不同的问题,因为没有子视图或节点可以做同样的事情.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...