使用 UIGestureRecogniser 子类化时未调用 Touches Ended
Posted
技术标签:
【中文标题】使用 UIGestureRecogniser 子类化时未调用 Touches Ended【英文标题】:Touches Ended not called when subclassed with UIGestureRecogniser 【发布时间】:2016-01-21 21:18:49 【问题描述】:我正在尝试为我的视图创建一个自定义手势识别器。我正在关注这里提到的这个答案:但由于某种原因,触摸的 Ended 和 touchesmoved 没有被调用。只有touches开始被调用。
子类:
#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 ?
【问题讨论】:
【参考方案1】:当子类化UIGestureRecognizer
时,您必须使其表现得像一个连续手势并自己处理它的状态机(即手动设置它为state
)。
来自 UIGestureRecognizer 上的 ios 开发人员库文档:
子类在状态之间转换时必须将 state 属性设置为适当的值。
See here for more info(向下滚动到Subclasing Notes)
注意:要使state
读/写而不是只读,您应该使用UIGestureRecognizerSubclass.h
,如文档中所述:
状态属性在 UIGestureRecognizer.h 中声明为只读。此属性声明适用于手势识别器的客户端。 UIGestureRecognizer 的子类必须导入 UIGestureRecognizerSubclass.h。此头文件包含一个重新声明的状态,使其可读写。
【讨论】:
【参考方案2】:我发现这是双击手势所必需的,而不是单击手势所必需的:
doubleTapGestureRecognizer.delaysTouchesEnded = NO;
【讨论】:
以上是关于使用 UIGestureRecogniser 子类化时未调用 Touches Ended的主要内容,如果未能解决你的问题,请参考以下文章
Swift UIGestureRecogniser 跟随手指
UITableView 和 UIGestureRecogniser