识别后使UIGestureRecognizer失败的方法?

Sea*_*Lee 8 uiscrollview uigesturerecognizer ios

我有一个看似基本的问题,但无法弄明白.

基本问题是:如何以编程方式将一个手势识别器从处理程序置于失败状态,而它位于UIGestureRecognizerStateBegan或UIGestureRecognizerStateChanged?

更详细的解释:我在UIScrollView中有一个用于UIView的长按手势识别器.我做了

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

因为否则一旦用户将手指放在视图中,我就无法滚动滚动视图.这是基本的触摸,如safari,你在一个链接上按住手指,突出链接,但向上或向下滚动 - 然后链接没有突出显示和滚动视图移动.

我现在可以正常工作,因为这两个手势都被识别了,但如果我能检测到长按手势识别器的StateChanged中的移动会更好,如果它超过20像素左右,只需以编程方式使longpress失败.

这可能吗?还是我在错误的地方挖掘?

Sea*_*Lee 5

发布问题后,我立即发现了另一个问题。

这是我现在在手势识别处理程序中执行的操作:

else if (sender.state == UIGestureRecognizerStateChanged) {
    CGPoint newTouchPoint = [sender locationInView:[self superview]];

    CGFloat dx = newTouchPoint.x - initTouchPoint.x;
    CGFloat dy = newTouchPoint.y - initTouchPoint.y;
    if (sqrt(dx*dx + dy*dy) > 25.0) {
        sender.enabled = NO;
        sender.enabled = YES;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果手指在任何方向上移动超过25个像素,则将enabled属性设置为NO将使识别器失败。这样就可以完成我想要的!