我有以下手势设置:
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
}