如何以编程方式结束/重置UIGestureRecognizer?

时间:2012-09-05 09:55:51

标签: ios uigesturerecognizer gesture

说我正在跟踪拖动手势。在我的事件处理程序中,我使用阈值来确定拖动何时导致操作。超过阈值时,我想表明拖动手势已经完成。

我在文档中唯一能找到的就是这一行here

  

如果在手势识别器处于此状态时将此属性更改为“否”   当前识别手势,手势识别器转换到   被取消的州。

所以:

if (translation.y > 100) {
    // do action
    [self doAction];

    //end recognizer
    sender.enabled = NO;
    sender.enabled = YES;
}

这样可行,但看起来可能有更简洁的方式。

有没有人知道另一种表示手势以编程方式结束的方式?我希望像-end:这样的方法可以生成状态为UIGestureRecognizerStateEnded的最终事件。

2 个答案:

答案 0 :(得分:8)

您是否定义了自定义UIGestureRecognizer?如果您识别的手势与Apple定义的手势不同,因为它具有不同的阈值或者与常规UIPanGestureRecognizer不同,那么创建自己的UIGestureRecognizer可能是有意义的。 (see subclassing notes

如果你有UIGestureRecognizer的子类,你可以简单地设置这样的状态:

  self.state = UIGestureRecognizerStateEnded;

您可能希望在touchesMoved:withEvent:方法中执行此操作。另请注意:

“UIGestureRecognizer的子类必须导入UIGestureRecognizerSubclass.h。此头文件包含重新声明的状态,使其成为读写。”

另一方面,如果您只实现UIGestureRecognizerDelegate,则状态是只读的,并且无法直接设置它。在这种情况下,您的禁用/启用方法可能是您可以做的最佳方法。

答案 1 :(得分:4)

使用您展示的代码,您需要拥有在取消手势识别器时启动动画的逻辑,并且我说这不是很好,因为有其他方法可以取消此手势识别器而不需要您完成动画。

考虑到你有一个启动动画的方法,你只需要在传递阈值和手势正常结束时调用此方法。然后两个不同的场合。 您提供的代码如下所示:

if (translation.y > 100) {
    // do action
    [self finishFlip];
    sender.enabled = NO;
    sender.enabled = YES;
}

如果用户继续拖动手指,则取消此处的手势可能也很有用。

如果你有一个团队开发这个并且你需要一个特定的事件发生,你应该将手势识别器子类化为不建议。