触摸在使用UIGestureRecogniser进行子类化时未调用

时间:2016-01-21 21:18:49

标签: ios objective-c uiview uigesturerecognizer uitouch

我正在尝试为我的视图创建自定义手势识别器。我正在按照这里提到的答案:但由于某种原因,触摸的Ended和触摸移动都没有被调用。只有接触才开始被召唤。

子类

#import "TapGesture.h"
#import <UIKit/UIGestureRecognizerSubclass.h>

@implementation TapGesture

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    if (self.state == UIGestureRecognizerStatePossible) {
        self.state = UIGestureRecognizerStateRecognized;
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    self.state = UIGestureRecognizerStateFailed;
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    self.state = UIGestureRecognizerStateFailed;
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{

}

@end

我正在按如下方式初始化TapGesture:

TapGesture *tapGesture=[[TapGesture alloc]initWithTarget:self action:@selector(incrementValue)];
tapGesture.delaysTouchesEnded=NO;
tapGesture.cancelsTouchesInView=NO;
[_workButton addGestureRecognizer:tapGesture]; //_workButton is a UIView

我在视图中没有任何其他手势识别器。如果我在UIView中使用相同的方法,则所有这些方法都按预期调用。

为什么在UIGestureRecogniser类中重写时没有调用touchesEnded / touchesMoved?

2 个答案:

答案 0 :(得分:4)

当继承UIGestureRecognizer时,你必须使它像连续手势一样,并自己处理它的状态机(即手动设置它{{1} }})。

来自 UIGestureRecognizer 上的iOS开发者库文档:

  

子类必须在状态之间转换时将state属性设置为适当的值。

See here for more info(向下滚动到子类型注释

  • 注意:要使state读/写而不是只读,您应该使用state,如文档中所述:

      

    state属性在UIGestureRecognizer.h中声明为只读。此属性声明适用于手势识别器的客户端。 UIGestureRecognizer的子类必须导入UIGestureRecognizerSubclass.h。此头文件包含重新声明的状态,使其成为可读写。

答案 1 :(得分:0)

我发现这是双击手势所必需的,但不适用于单击手势:

doubleTapGestureRecognizer.delaysTouchesEnded = NO;