iOS 第一次打开时区分单击和双击

iOS distinguish single tap and double tap at first opening

我知道我可以使用 requireGestureRecognizerToFail 函数来区分单击和双击,但是我遇到了一个小问题,我想修复它。我的代码如下:

- (IBAction)singleTap:(UITapGestureRecognizer *)sender {
    NSLOGD_METADATAONLY();
    hideNavigationBar();
    hideStatusBar();
    [sender requireGestureRecognizerToFail:self.doubleTapRecognizer];
}

- (IBAction)doubleTap:(UITapGestureRecognizer *)sender {
    NSLOGD_METADATAONLY();
    //TODO
}

当我打开文件并双击(action1) 时,会先调用单击(result1),然后调用双击(result2)。

但是如果我打开一个文件并单击(action3),然后双击(action4),action4 的结果运行良好,将不会调用单击,只会调用双击。我想这是因为在 action3 中调用了函数 requireGestureRecognizerToFail

我的问题是如何让 action1 只调用 result2 而不是调用 result1?

在 ViewDidLoad 中写入以下行
[单击 requireGestureRecognizerToFail:doubleTap];

在创建 UITapGestureRecognizer

时使用 [singleTapRecognizer requireGestureRecognizerToFail: doubleTapRecognizer] 更新您的代码

示例:

    // single tap    
    UITapGestureRecognizer *singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector(handleSingleTapOnView:)];                                 
    [singleTapRecognizer setNumberOfTouchesRequired:1];
    [singleTapRecognizer requireGestureRecognizerToFail:doubleTapRecognizer];
    [view addGestureRecognizer: singleTapRecognizer];

    // double tap 
    UITapGestureRecognizer *doubleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: tableViewController action: @selector (handleDoubleTapOnView:)];        
    [doubleTapRecognizer setNumberOfTouchesRequired:2];         
    [view addGestureRecognizer: doubleTapRecognizer]; 

当您为手势识别器设置 requireGestureRecognizerToFail: 时,您是说它应该只识别其他手势识别器不识别的手势。

将您的 class 扩展为 UIGestureRecognizerDelegate

class ViewController: UIViewController, UIGestureRecognizerDelegate {

然后将您的视图控制器指定为手势识别器的委托。

tapGesture .delegate = self;
doubleTapGesture .delegate = self;

实施 shouldRequireFailureOf 可防止在另一个手势识别器明确达到失败状态之前识别一个手势。

您只需要在双击失败后识别单击,这种情况发生在触摸序列仅包含一次点击时。 这可以通过以下实现来实现。

   func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
                   shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// Don't recognize a single tap until a double-tap fails.
       if gestureRecognizer == self.tapGesture &&
            otherGestureRecognizer == self.doubleTapGesture {
          return true
        }
    return false
  }

希望如此helps.Happy编码!!