如何为单次点击事件和双击事件筛选快速多次点击



我有以下手势设置:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                            action:@selector(singleTapDetected:)];
singleTap.numberOfTapsRequired = 1;
[self addGestureRecognizer:singleTap];
UITapGestureRecognizer *doubleClick = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                              action:@selector(doubleClickDetected:)];
doubleClick.numberOfTapsRequired = 2;
[self addGestureRecognizer:doubleClick];
[singleTap requireGestureRecognizerToFail:doubleClick];

当我快速点击3次时,我发现它会被翻译成一个双击事件和一个单点事件,并为我的应用程序引入了一个错误。

我想要的是,如果用户点击3次或更多次,只会触发双击事件。有人能帮上忙吗?提前感谢。

我回答这个问题是为了iOS 10和Swift 3开发人员的利益。

目前在iOS 10和Swift 3中,这个问题并不存在。如果未进行处理,三次敲击会降级为双击,并触发相应的操作。试试下面的例子:

Swift 3解决方案:

doubleTap = UITapGestureRecognizer(target: self, action:#selector(self.doubleTapAction(_:)))
doubleTap.numberOfTapsRequired = 2

singleTap = UITapGestureRecognizer(target: self, action:#selector(self.singleTapAction(_:)))
singleTap.numberOfTapsRequired = 1
singleTap.require(toFail: doubleTap)
self.view.addGestureRecognizer(doubletap)
self.view.addGestureRecognizer(singleTap)

我创建了一个自定义识别器,如下所示,也解决了我的问题:

@implementation MyTapGestureRecognizer
/**
 *  touchesBegan for custom taps will filter > 2 taps
 *
 *  @param touches touches the recognizer gets
 *  @param event   related event
 */
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    if ([touches count] != 1) {
        return;
    } else {
        UITouch *touch = [touches anyObject];
        if (touch.tapCount >= 3) {
            self.state = UIGestureRecognizerStateFailed;
            return;
        }
    }
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
}
- (void)reset {
    [super reset];
}
@end

双击后,可以使用手势识别器的委托来暂时禁用这两个手势。下面的代码在双击后禁用手势0.6秒。

你需要几个属性

@property int disableGestures;
@property CFTimeInterval timeStamp;

以及一些额外的初始化

self.disableGestures = NO;
singleTap.delegate = self;
doubleClick.delegate = self;

您需要遵守<UIGestureRecognizerDelegate>协议,并实现shouldReceiveTouch方法

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    if ( self.disableGestures )
    {
        if ( CACurrentMediaTime() - self.timeStamp < 0.6 )
            return NO;
        self.disableGestures = NO;
    }
    return YES;
}

剩下的就是双击后禁用手势

- (void)doubleClickDetected:(UITapGestureRecognizer *)gesture
{
    self.disableGestures = YES;
    self.timeStamp = CACurrentMediaTime();
    // normal processing for the double click goes here
}

最新更新