【问题标题】:How do I prevent a UITapGestureRecognizer from recognizing single taps in rapid succession?如何防止 UITapGestureRecognizer 快速连续识别单击?
【发布时间】:2025-11-28 21:35:01
【问题描述】:

我有一个分配了UITapGestureRecognizer 实例的视图。当用户点击一次时它会正确响应,但如果用户在短时间内再次点击,我想阻止它再次识别。

我在一个游戏中使用它,用户点击位置来寻找隐藏的对象。我正试图阻止“疯狂地在屏幕上点按”策略起作用。

有没有简单的解决办法?

【问题讨论】:

    标签: ios uiview uigesturerecognizer


    【解决方案1】:

    对于小于 1 秒的分辨率,我不建议使用 NSTimer。另外,它有更多的开销。阅读this answer 了解更多关于NSTimerCACurrentMediaTime() 的信息。

    - (IBAction)handleTap:(UITapGestureRecognizer *)tgr {
         static NSTimeInterval previousTapTime = 0.0; // Or an ivar
    
         if ((CACurrentMediaTime() - previousTapTime) > 1.0) {
             // A valid tap was detected, handle it
         }
    
         previousTapTime = CACurrentMediaTime();
    }
    

    【讨论】:

      【解决方案2】:

      使用计时器来确定是否接受点击。

      创建一个名为denyTapBOOL ivar。同时添加一个名为tapTimerNSTimer ivar。

      然后在您的点击识别器方法中,您执行以下操作:

      - (void)tapHandler:(UITapGestureRecognizer *)gesture {
          if (!denyTap) {
              dentTap = YES;
      
              // process the tap as needed
      
              // Now setup timer - choose a desired interval
              tapTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(tapTimer:) userInfo:nil repeats:NO];
          }
      }
      
      - (void)tapTimer:(NSTimer *)timer {
          denyTap = NO;
          tapTimer = nil;
      }
      

      【讨论】: