iPhone iOS如何将UILongPressGestureRecognitor和UITapGestureRecognitor添加到同一控件并防止冲突?

iPhone iOS如何将UILongPressGestureRecognitor和UITapGestureRecognitor添加到同一控件并防止冲突?,iphone,ios,uiview,uitapgesturerecognizer,long-press,Iphone,Ios,Uiview,Uitapgesturerecognizer,Long Press,我正在构建一个iPhone应用程序,它可以让用户重新排列屏幕上的一些UI元素 如何将轻触手势识别器和长按手势识别器添加到同一UIView?当我从长按中抬起手指时,轻触手势识别器启动。当用户执行长按时,如何临时禁用轻触手势识别器或防止其触发 谢谢大家! 您可以在代码中处理它,在长按期间,设置一个标志,如果在标志为true或其他情况下调用了tap,则不执行tap代码并重置标志。我不知道有什么更好的方法可以让两种手势一起工作,请实现以下委托方法: - (BOOL)gestureRecognizer:(

我正在构建一个iPhone应用程序,它可以让用户重新排列屏幕上的一些UI元素

如何将轻触手势识别器和长按手势识别器添加到同一UIView?当我从长按中抬起手指时,轻触手势识别器启动。当用户执行长按时,如何临时禁用轻触手势识别器或防止其触发


谢谢大家!

您可以在代码中处理它,在长按期间,设置一个标志,如果在标志为true或其他情况下调用了tap,则不执行tap代码并重置标志。我不知道有什么更好的方法可以让两种手势一起工作,请实现以下委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    return YES;
}
要使长按具有第一优先级,请执行以下操作:


[点击手势要求检测识别器邮件:longPress]

作为替代方法,不要有两个单独的识别器-只需对两个事件使用LongPress识别器即可:

配置如下:

UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)];
    categoryPanelDrag.minimumPressDuration = 0.0;
- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture {

    // _dragStarted is a class-level BOOL

    if(UIGestureRecognizerStateBegan == gesture.state) {
        _dragStarted = NO;
    }

    if(UIGestureRecognizerStateChanged == gesture.state) {
        _dragStarted = YES;
        // Do dragging stuff here
    }

    if(UIGestureRecognizerStateEnded == gesture.state) {

        if (_dragStarted == NO)
        {
            // Do tap stuff here

        }
        else
        {
            // Do drag ended stuff here
        }
    }

    return YES;

}
然后按如下方式处理:

UILongPressGestureRecognizer* longPress = [ [ UILongPressGestureRecognizer alloc ] initWithTarget:self.nextResponder action:@selector(longPressEvent:)];
    categoryPanelDrag.minimumPressDuration = 0.0;
- (BOOL)longPressEvent:(UILongPressGestureRecognizer *)gesture {

    // _dragStarted is a class-level BOOL

    if(UIGestureRecognizerStateBegan == gesture.state) {
        _dragStarted = NO;
    }

    if(UIGestureRecognizerStateChanged == gesture.state) {
        _dragStarted = YES;
        // Do dragging stuff here
    }

    if(UIGestureRecognizerStateEnded == gesture.state) {

        if (_dragStarted == NO)
        {
            // Do tap stuff here

        }
        else
        {
            // Do drag ended stuff here
        }
    }

    return YES;

}

我确实尝试过moby和journeyman的方法,但不知怎么的,他们不适合我的项目,所以我解决了如下问题

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
    NSLog(@"%@ %ld",touch.description, touch.phase);
    [self performSelector:@selector(checkTouch:) withObject:touch afterDelay:0.5];
    return YES;
}


这可能是一个更简单的解决方案,但当然这取决于项目。

要成功地将两者结合起来,您需要:

1º添加到标题处的界面手势代表

@interface ViewController : ViewController <UIGestureRecognizerDelegate>
4º设置手势识别器可用:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

@Softlion不要忘记.h文件上的UIGestureRecognitzerDelegate接口:-)它可以编译并运行,但不能防止冲突。我使用2个识别器和手势识别器解决了这个问题(“应该在手势识别器:)的情况下同时识别”)。回答得好,也脱下帽子。这最后一行代码就是我需要的。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}