触摸结束未被调用

时间:2014-03-02 12:19:59

标签: ios multi-touch

我一直在认识iOS应用程序中的触摸,我有这个简单的代码

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"%lu",(unsigned long)[touches count]);
 [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
     UITouch *touch = obj;
     CGPoint touchLocation = [touch locationInNode:self.scene];
     NSLog(@"B x:%f - y:%f",touchLocation.x,touchLocation.y);
 }];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
    UITouch *touch = obj;
    CGPoint touchLocation = [touch locationInNode:self.scene];
    NSLog(@"E x:%f - y:%f",touchLocation.x,touchLocation.y);
 }];
}

touchesBegan被称为罚款,如果我同时从屏幕上的1个手指放到5个手指,我看到它被正确的信息调用

touchesBegan同样没有发生,很多时候如果我在屏幕上有3个手指并同时移除它们,我只看到2个触摸的信息被结束(有时甚至1个)。如果我一次取出一个手指,该方法通常也会被调用2次(有时为1次,尽管很少被称为正确的3次) 随着触摸次数的增加,touchesEnded方法中未显示某些信息的可能性

方法touchesMoved:withEvent:touchesCancelled:withEvent:也使用相同的逻辑

实现

有人可以解释这种行为吗?我有什么遗失的吗?

7 个答案:

答案 0 :(得分:25)

您必须在Swift中设置recognizer.cancelsTouchesInView = false或在Objective-C中设置recognizer.cancelsTouchesInView = NO;

答案 1 :(得分:21)

尝试删除该视图中的所有手势识别器。他们可能会干扰touchesEnded

答案 2 :(得分:5)

如果不调用super的实现,则必须覆盖所有触摸方法。因此,您还必须实施touchesMoved:withEvent:touchesCancelled:withEvent: 方法。实现可以是空的,但你必须这样做。

  

<强> touchesBegan:withEvent:

     

如果在不调用super的情况下覆盖此方法(常用)   pattern),你还必须覆盖其他处理触摸的方法   事件,如果仅作为存根(空)实现。

基于UIResponder Class Reference

答案 3 :(得分:1)

尝试覆盖UIView的{​​{1}}方法:

hitTest

当您抬起手指时,他们可能无法识别出- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { return self; } ,因此不会调用UIView

答案 4 :(得分:1)

  • 轻击手势(简单,长,2x短,2x手指轻击)不允许调用Touches Ended / Cancels(如果cancelsTouchesInView == NO,则取消)
  • 只有当cancelsTouchesInView属性默认为YES时,它们才允许其调用
  • 仅当cancelsTouchesInView属性设置为NO时,捏手势才允许所有呼叫(触摸开始/移动/结束/取消)。
  • 如果捏手势的cancelsTouchesInView属性为YES,则不会调用touchesMoved

内部信息:

  

我正在使用:

     
      
  • 1个手指UITapGestureRecognizer
  •   
  • 1个手指UILongPressGestureRecognizer
  •   
  • 1指双击UITapGestureRecognizer
  •   
  • 两根手指点击UITapGestureRecognizer
  •   
  • 1个UIPinchGestureRecognizer
  •   
     

并且也应该用一根手指摇摄。但是我发现的是   即使用户抬起一根手指,捏手势也不会结束。   iOS仍然以某种方式通过“ Changed”调用Pinch的选择器   状态。

     

我的解决方案是使用touchesBegin / Moved / Ended来抓锅   并使用有效触摸次数作为安全检查,以防出现挤压   选择器将被调用。

在进行上述配置时必须使用的其他设置:

self.multipleTouchEnabled = YES;
[oneFingerTapRecognizer requireGestureRecognizerToFail:oneFingerLongPressRecognizer];
[oneFingerTapRecognizer requireGestureRecognizerToFail:oneFingerDoubleTapRecognizer];
[oneFingerLongPressRecognizer requireGestureRecognizerToFail:oneFingerDoubleTapRecognizer];
[twoFingersTapRecognizer requireGestureRecognizerToFail:twoFingersPinch];

答案 5 :(得分:0)

我遇到了同样的问题,并在结束的触摸中用这个简单的代码解决了它:

NSInteger touchCount = 0;
for (UITouch *touch in touches) {
   touchCount++;
    if([[event allTouches]count] == touchCount){
       // do what you have to do here
    }
}

//这里会收到警告,但不关心它

我希望这有帮助!

答案 6 :(得分:0)

即使在定义了所有四个触摸处理程序之后,我也遇到了同样的问题。我也没有任何主动识别器。

我的解决方案就是在我的视图上启用多点触控事件,就像这样

self.multipleTouchEnabled = YES;

神奇地解决了这个问题。

请注意,我确实得到了&#34;多点触控&#34;甚至在此之前的事件,即同时多个手指的事件,但我有上述问题,并非所有这些都被正确结束。

希望有人帮助! :)