如何告诉UIGestureRecognizer取消现有的触摸?

我有一个UIPanGestureRecognizer我用来跟踪用户的手指下的对象( UIImageView )。 我只关心X轴上的运动,如果触摸在Y轴上的对象框架的上方或下方偏离,我想要结束触摸。

我有我需要的一切来确定一个触摸是否在对象的Y边界内,但我不知道如何取消触摸事件。 翻转识别器的cancelsTouchesInView属性似乎没有做我想要的。

谢谢!

这个小技巧适用于我。

 @implementation UIGestureRecognizer (Cancel) - (void)cancel { self.enabled = NO; self.enabled = YES; } @end 

UIGestureRecognizer @enabled文档:

禁用手势识别器,因此它不会触摸。 默认值是YES。 如果在手势识别器当前正在识别手势时将此属性更改为NO,则手势识别器将转换为取消状态。

@ matej的答案在Swift中。

 extension UIGestureRecognizer { func cancel() { isEnabled = false isEnabled = true } } 

OBJ-C:

 recognizer.enabled = NO; recognizer.enabled = YES; 

Swift 3:

 recognizer.isEnabled = false recognizer.isEnabled = true 

从苹果文档如何呢?

 @property(nonatomic, getter=isEnabled) BOOL enabled 

禁用手势识别器,因此它不会触摸。 默认值是YES。 如果在手势识别器当前正在识别手势时将此属性更改为NO,则手势识别器将转换为取消状态。

你有几个办法来处理这个问题:

  1. 如果您正在编写自定义平移手势识别器子类,则可以通过在识别器内部调用-ignoreTouch:withEvent:时轻松完成此操作,当您注意到它偏离了您所关心的区域时。

  2. 由于您使用的是标准的平移识别器,并且触摸开始于 OK(因此您不想通过委托函数来阻止它),所以当您收到识别器的目标操作时,您只能做出区分。 检查translationInView:locationInView:的Y值locationInView:返回值,并适当地将其夹紧。

根据文档,您可以将手势识别器子类化:

在YourPanGestureRecognizer.m中:

 #import "YourPanGestureRecognizer.h" @implementation YourPanGestureRecognizer - (void) cancelGesture { self.state=UIGestureRecognizerStateCancelled; } @end 

在YourPanGestureRecognizer.h中:

 #import <UIKit/UIKit.h> #import <UIKit/UIGestureRecognizerSubclass.h> @interface NPPanGestureRecognizer: UIPanGestureRecognizer - (void) cancelGesture; @end 

现在你可以从任何地方打电话

 YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)]; [self.view addGestureRecognizer:panRecognizer]; [...] -(void) panMoved:(YourPanGestureRecognizer*)sender { [sender cancelGesture]; // This will be called twice } 

参考: https : //developer.apple.com/documentation/uikit/uigesturerecognizer? language = bjc