我有一个 UIPanGestureRecognizer,我用来跟踪一个对象(UIImageView)以下的用户的手指。我只关心 X 轴上的运动,如果触摸在 Y 轴上的物体框架的上方或下方偏离,我想结束触摸。
UIPanGestureRecognizer
UIImageView
我已经得到了一切我需要确定触摸是否在对象的 Y 边界内,但我不知道如何取消触摸事件。翻转识别程序的 cancelsTouchesInView属性似乎没有我想要的效果。
cancelsTouchesInView
谢谢!
这个小把戏对我有用。
@implementation UIGestureRecognizer (Cancel) - (void)cancel { self.enabled = NO; self.enabled = YES; } @end
来自 UIGestureRecognizer @enabled文档:
UIGestureRecognizer @enabled
禁用手势识别器 不接受触摸。默认 值是 YES。如果您更改此 属性为 NO 而一个手势 识别程序当前正在识别一个 手势,手势识别器 转换到被取消的状态。
你有几种方法来处理这个问题:
如果您正在编写一个自定义 pan 姿态识别器子类,那么当您注意到它偏离了您所关心的区域时,您可以通过从识别器内部调用 -ignoreTouch:withEvent:来轻松地完成这项工作。
-ignoreTouch:withEvent:
由于您使用的是标准的 Pan 识别器,而且触摸 开始 OK (因此您不希望使用委托函数来阻止它) ,所以只有在接收到识别器的目标操作时才能真正做出区分。检查 translationInView:或 locationInView:返回值的 Y 值,并适当夹紧。
translationInView:
locationInView:
这样如何,从 苹果医生:
@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
handlePan(_ recognizer: UIPanGestureRecognizer)
recognizer.state
.ended
.cancelled