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

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

我已经得到了一切我需要确定触摸是否在对象的 Y 边界内,但我不知道如何取消触摸事件。翻转识别程序的 cancelsTouchesInView属性似乎没有我想要的效果。

谢谢!

38415 次浏览

这个小把戏对我有用。

@implementation UIGestureRecognizer (Cancel)


- (void)cancel {
self.enabled = NO;
self.enabled = YES;
}


@end

来自 UIGestureRecognizer @enabled文档:

禁用手势识别器 不接受触摸。默认 值是 YES。如果您更改此 属性为 NO 而一个手势 识别程序当前正在识别一个 手势,手势识别器 转换到被取消的状态。

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

  1. 如果您正在编写一个自定义 pan 姿态识别器子类,那么当您注意到它偏离了您所关心的区域时,您可以通过从识别器内部调用 -ignoreTouch:withEvent:来轻松地完成这项工作。

  2. 由于您使用的是标准的 Pan 识别器,而且触摸 开始 OK (因此您不希望使用委托函数来阻止它) ,所以只有在接收到识别器的目标操作时才能真正做出区分。检查 translationInView:locationInView:返回值的 Y 值,并适当夹紧。

这样如何,从 苹果医生:

@property(nonatomic, getter=isEnabled) BOOL enabled

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

@ matej’s answer in Swift。

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

目标 C:

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

斯威夫特3:

recognizer.isEnabled = false
recognizer.isEnabled = true

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

返回文章页面你的手势识别:

#import "YourPanGestureRecognizer.h"


@implementation YourPanGestureRecognizer


- (void) cancelGesture {
self.state=UIGestureRecognizerStateCancelled;
}


@end

返回文章页面你的手势识别:

#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=objc

只需将 handlePan(_ recognizer: UIPanGestureRecognizer)方法中的 recognizer.state设置为 .ended.cancelled