首页 文章

如何使用UITapGestureRecognizer同时检测点击和双击?

提问于
浏览
12

例如,我有一个视图,我想要两个不同的手势:

点击做动作A.双击做动作B.

问题在于UITapGestureRecognizer我只能设置最小所需的点击次数 . 单击手势识别器在双击手势识别器识别双击之前识别轻击 .

例:

_tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureRecognized:)];
_tapGestureRecognizer.numberOfTouchesRequired = 1;
_tapGestureRecognizer.numberOfTapsRequired = 1;
[self addGestureRecognizer:_tapGestureRecognizer];

_doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTapGestureRecognized:)];
_doubleTapGestureRecognizer.numberOfTouchesRequired = 1;
_doubleTapGestureRecognizer.numberOfTapsRequired = 2;
[self addGestureRecognizer:_doubleTapGestureRecognizer];

它总是识别单击,即使我非常快地双击 . 如何设置它以使轻敲手势识别器等待并看到双击手势识别器是否识别?

4 回答

  • 0

    在swift 3和swift 4:

    let singleTap = UITapGestureRecognizer(target: self, action: #selector(doSingleTap))
    singleTap.numberOfTapsRequired = 1
    
    self.view.addGestureRecognizer(singleTap)
    
    let doubleTap = UITapGestureRecognizer(target: self, action: #selector(doDoubleTap))
    doubleTap.numberOfTapsRequired = 2
    
    self.view.addGestureRecognizer(doubleTap)
    
    singleTap.require(toFail: doubleTap)
    
  • 43

    这是我在一个旧项目中使用的,我希望它可以帮助你解决问题 .

    UITapGestureRecognizer *singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:    self action:@selector(doSingleTap)] autorelease];
    singleTap.numberOfTapsRequired = 1; 
    [self.view addGestureRecognizer:singleTap];
    
     UITapGestureRecognizer *doubleTap = [[[UITapGestureRecognizer alloc] initWithTarget:   self action:@selector(doDoubleTap)] autorelease];
     doubleTap.numberOfTapsRequired = 2; 
     [self.view addGestureRecognizer:doubleTap];
    
      [singleTap requireGestureRecognizerToFail:doubleTap];
    
  • -1
    {  UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTapGesture:)];
            [doubleTap setDelegate:self];
            doubleTap.numberOfTapsRequired = 2;
            [self.headerView addGestureRecognizer:doubleTap];
    
            UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTapGesture:)];
            singleTap.numberOfTapsRequired = 1;
            [singleTap setDelegate:self];
            [doubleTap setDelaysTouchesBegan:YES];
            [singleTap setDelaysTouchesBegan:YES];
            [self.headerView addGestureRecognizer:singleTap];
      }  
            - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
                return  YES;
            }
    
        - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
            return YES;
        }
    

    在您想要的任何方法中创建手势识别器 . 例如,如果您想在tableView中使用tapView的tap手势,请在里面创建那些点按手势

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
    

    你的类应该实现UIGestureRecognizerDelegate . 上面提到的是该委托类的2种方法 .

  • 6

    我找到了使用XCode Monkey的答案来解决单击的延迟问题 . 使用此方法,您可以在mili-seconds中配置单击和双击之间的阈值 . 该技术使用简单的UIButton和NSTimer来区分单击和双击 .

    @property NSTimer       *tapTimer;
    @property BOOL           isDoubleTap;
    
      UIButton *yourButton = [UIButton new];
      yourButton.frame = // set your frame
      [yourButton addTarget:self action:@selector(handleTap:) forControlEvents:UIControlEventTouchUpInside];
      [self.view yourButton];
    
    
    -(void)handleTap:(UIButton*)button
    {
      [self.tapTimer invalidate];
    
      if (self.isDoubleTap)
      {
        [self doDoubleTap];
        return;
      }
      self.isDoubleTap = YES;
      // CHANGE THE 0.3 SECOND THRESHOLD BETWEEN SINGLE/DOUBLE TAP TO YOUR HEART'S CONTENT
      self.tapTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(doSingleTap) userInfo:nil repeats:NO];
    }
    
    -(void)doSingleTap
    {
      self.isDoubleTap = NO;
    }
    
    -(void)doDoubleTap
    {
      self.isDoubleTap = NO;
    }
    

相关问题