使用 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

UIGestureRecognizer 键值编码

Swift 4为UIView添加自定义圆形[关闭]

子类继承父类时,子类与父类有同名变量,当使用子类对象调用父类方法使用同名变量,这个变量是子类的,还是父类的? (改)

如何在许多子类中使用 UITableViewDelegate 子类化 UIViewController