如何告诉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,则手势识别器将转换为取消状态。
你有几个办法来处理这个问题:
-
如果您正在编写自定义平移手势识别器子类,则可以通过在识别器内部调用
-ignoreTouch:withEvent:
时轻松完成此操作,当您注意到它偏离了您所关心的区域时。 -
由于您使用的是标准的平移识别器,并且触摸开始于 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