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

时间:2010-10-14 21:43:43

标签: cocoa-touch uigesturerecognizer

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

我已经拥有了确定触摸是否在对象的Y范围内所需的一切,但我不知道如何取消触摸事件。翻转识别器的cancelsTouchesInView属性似乎无法实现我的目的。

谢谢!

7 个答案:

答案 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)

apple docs

的情况如何
@property(nonatomic, getter=isEnabled) BOOL enabled

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

您有几种方法可以解决这个问题:

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

    < / LI>
  2. 由于您正在使用标准的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