我有UIPanGestureRecognizer
我用来跟踪用户手指下方的对象(UIImageView
)。我只关心X轴上的运动,如果触摸偏离Y轴上物体框架的上方或下方,我想结束触摸。
我已经拥有了确定触摸是否在对象的Y范围内所需的一切,但我不知道如何取消触摸事件。翻转识别器的cancelsTouchesInView
属性似乎无法实现我的目的。
谢谢!
答案 0 :(得分:150)
这个小技巧对我有用。
@implementation UIGestureRecognizer (Cancel)
- (void)cancel {
self.enabled = NO;
self.enabled = YES;
}
@end
来自UIGestureRecognizer @enabled
文档:
禁用手势识别器 不接受接触。默认 值为YES。如果你改变这个 一个手势的财产到NO 识别器目前正在认识到 手势,手势识别器 转换到取消状态。
答案 1 :(得分:10)
@ matej在Swift中的回答。
extension UIGestureRecognizer {
func cancel() {
isEnabled = false
isEnabled = true
}
}
答案 2 :(得分:8)
的OBJ-C:
recognizer.enabled = NO;
recognizer.enabled = YES;
斯威夫特3:
recognizer.isEnabled = false
recognizer.isEnabled = true
答案 3 :(得分:3)
@property(nonatomic, getter=isEnabled) BOOL enabled
禁用手势识别器,使其无法接收触摸。默认值为YES。如果在手势识别器当前正在识别手势时将此属性更改为“否”,则手势识别器将转换为已取消状态。
答案 4 :(得分:1)
只需将recognizer.state
方法中的handlePan(_ recognizer: UIPanGestureRecognizer)
设置为.ended
或.cancelled
答案 5 :(得分:0)
您有几种方法可以解决这个问题:
如果您正在编写自定义平移手势识别器子类,当您发现它从您关注的区域偏离时,可以通过从识别器内部调用-ignoreTouch:withEvent:
来轻松完成此操作。
由于您正在使用标准的Pan识别器,并且触摸启动确定(因此您不希望使用委托功能阻止它),您实际上只能制作当您收到识别器的目标操作时,您的区别。检查translationInView:
或locationInView:
返回值的Y值,并将其钳制得恰到好处。
答案 6 :(得分:0)
根据文档,您可以将手势识别器子类化:
在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=objc