【问题标题】:How to detect tap and double tap at same time using UITapGestureRecognizer?如何使用 UITapGestureRecognizer 同时检测点击和双击?
【发布时间】:2013-10-08 06:44:23
【问题描述】:

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

点击以执行操作 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];

即使我非常快速地双击它,它也总是能识别单击。如何进行设置,以便轻按手势识别器等待并查看双击手势识别器是否识别?

【问题讨论】:

标签: iphone ios uigesturerecognizer uitapgesturerecognizer


【解决方案1】:

这是我在一个旧项目中使用的,希望对您有所帮助。

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];

【讨论】:

  • 完美!非常感谢!
  • 这有效,但是对于单击它会延迟单击调用
  • ^^ 有没有人想出解决这个延迟的办法?
  • 对于像@barfoon 这样仍有延迟取消双击的人,请参考 eladleb 的此解决方案:stackoverflow.com/a/23415324/1158074 并使用双击手势的子类发送“状态失败” " 更快。
【解决方案2】:

我使用 XCode Monkey 的回答找到了单击延迟的解决方案。使用这种方法,您可以以毫秒为单位配置单击和双击之间的阈值。该技术使用简单的 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;
}

【讨论】:

  • 延迟没有改善,并且用户在 0.3 秒内点击多个单元格会产生潜在问题
  • 您要么必须保持显着的 (0.2) 延迟,要么在单击计时器到期之前无法注册双击检测。
【解决方案3】:

在 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)

【讨论】:

  • 我使用 singleTap.requireGestureRecognizerToFail(doubleTap) 而不是 singleTap.require(toFail: doubleTap)
  • 答案是 Swift 3 @Marcos
【解决方案4】:
   {  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 中为 headerView 的点击手势在

中创建这些点击手势
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

你的班级应该实现 UIGestureRecognizerDelegate。 上面提到的是该委托类的 2 个方法。

【讨论】:

  • 一些解释会显着提高您的回答质量。
猜你喜欢
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多