【问题标题】:Touches Ended not being called触摸结束没有被调用
【发布时间】:2014-03-02 12:19:58
【问题描述】:

我一直在尝试识别 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:也实现了,逻辑相同

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

【问题讨论】:

  • 您解决了这个问题吗?
  • 有公认的答案吗?

标签: ios multi-touch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试删除您在该视图上的所有手势识别器。他们可以干扰touchesEnded

    【讨论】:

    • 所有事件?滑动和触摸事件会相互干扰吗?
    • 我也遇到了同样的情况,如果多个手势识别器干扰-touchesEnded:-touchesCanelled: 可以省略其中一个。 重要提示: 不要依赖这些方法来重置/清理您的手势识别器状态。而是为您覆盖 -reset 方法,即使 -touchesEnded: 不是 -touchesCanelled: 也会调用该方法。
    • 你救了我!谢谢你。完美运行。
    【解决方案3】:

    如果你不调用 super 的实现,你必须重写所有的 touch 方法。所以你还必须实现touchesMoved:withEvent:touchesCancelled:withEvent: 方法。实现可以是空的,但你必须这样做。

    touchesBegan:withEvent:

    如果你在不调用 super 的情况下重写了这个方法(一个常见的用法 模式),您还必须覆盖其他处理触摸的方法 事件,如果只是作为存根(空)实现。

    基于UIResponder Class Reference

    【讨论】:

    • 为简洁起见,我没有添加此信息,但我确实实现了所有 4 种方法
    • 我已经实现了所有 4 个,但我的 touchesEnded 仍然没有被调用
    【解决方案4】:

    尝试覆盖UIViewhitTest 方法:

    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
       return self;
    }
    

    有可能当您抬起手指时,它们不会被识别为在UIView 中,因此不会调用touchesEnded

    【讨论】:

    • 我已经看到很多次遇到类似问题的人
    【解决方案5】:
    • 点击手势(简单、长、2xshort、2xfingers 点击)不允许调用 Touches Ended / Canceled if cancelsTouchesInView == NO
    • 只有在 cancelsTouchesInView 属性默认为 YES 时才允许调用它
    • 只有当 cancelsTouchesInView 属性设置为 NO 时,捏合手势才允许所有调用(对 Touches Begin / Moved / Ended / Canceled)
    • 如果对于捏合手势,cancelsTouchesInView 属性为 YES,则不会调用 touchesMoved

    内幕消息:

    我正在使用:

    • 1 指 UITapGestureRecognizer
    • 1 个手指 UILongPressGestureRecognizer
    • 1 手指双击 UITapGestureRecognizer
    • 2 指轻按 UITapGestureRecognizer
    • 1 UIPinchGestureRecognizer

    并且还应该接收一根手指平移。但我发现 即使用户抬起一根手指,捏合手势也不会结束。 不知何故,iOS 仍在使用“已更改”调用 Pinch 的选择器 状态。

    我的解决方案是使用 touchesBegin/Moved/Ended 来接锅 并使用活动触摸的次数作为安全检查,以防夹伤 选择器会被调用。

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

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

    【讨论】:

      【解决方案6】:

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

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

      // 你会在这里得到一个警告但不要在意它

      希望对你有所帮助!

      【讨论】:

        【解决方案7】:

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

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

        self.multipleTouchEnabled = YES;
        

        神奇地解决了这个问题。

        请注意,在此之前我确实收到了“多点触控”事件,即多个手指同时发生的事件,但我遇到了上述问题,即并非所有手指都正确结束。

        希望对某人有所帮助! :)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-11-02
          • 2012-06-30
          • 1970-01-01
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          • 2023-04-03
          相关资源
          最近更新 更多