我正在尝试为我的视图创建自定义手势识别器。我正在按照这里提到的答案:但由于某种原因,触摸的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?
答案 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;