如何同时为同一控件添加UILongPressGestureRecognizer和UITapGestureRecognizer手势识别器?

4

这个问题与以下问题类似:

iPhone iOS如何将UILongPressGestureRecognizer和UITapGestureRecognizer添加到同一个控件并防止冲突?

但我的问题更加复杂。

我想在iPad上实现与iOS 8中Safari中看到的页面网格相同的行为。

问题是:一个视图应该响应长按手势和轻击手势。 应该有以下功能:

1)关闭按钮接受点击

2)当轻触开始时,所选视图应执行缩放动画

3)长按选择的视图变为可拖动状态

如果我不使用(requireGestureRecognizerToFail:),则轻击手势无法工作。 如果我使用此方法,则一切正常,但长按事件会出现巨大延迟。

如何解决这个问题。

2个回答

2
您需要使用requireGestureRecognizerToFail方法。
//Single tap
        UITapGestureRecognizer *tapDouble = [[UITapGestureRecognizer alloc]
                                             initWithTarget:self
                                             action:@selector(handleTapGestureForSearch:)];
        tapDouble.numberOfTapsRequired = 1;
        tapDouble.delegate = self;
        [self addGestureRecognizer:tapDouble];

        //long press
        UILongPressGestureRecognizer *longPressGestureRecognizer=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongPressRecognizer:)];
        longPressGestureRecognizer.numberOfTouchesRequired=1;
        longPressGestureRecognizer.minimumPressDuration = 0.5f;
        [longPressGestureRecognizer requireGestureRecognizerToFail:tapDouble];
        longPressGestureRecognizer.delegate = self;
        [self addGestureRecognizer:longPressGestureRecognizer];

这意味着长按手势等待单击。

对于您来说,在这种情况下,长按手势等待的时间太长了。 - Vyachaslav Gerchicov
1
如果是这样,那么请使用NSTimer而不是长按。 - svrushal
我无法理解你对于计时器的想法。你能再详细解释一下吗? - Vyachaslav Gerchicov
我将此标记为答案以关闭问题。您只是重复了问题描述,但加上了代码。 - Vyachaslav Gerchicov
@VyachaslavGerchicov,你不能仅仅为了关闭问题而将一个答案标记为正确答案,这违背了使用StackOverflow的初衷。这个答案是错误的,应该被指出来。 - strangetimes

0

您可以为长按手势添加时间。

 UILongPressGestureRecognizer *longPressGesture=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(ontappLongPressGesture:)];
 longPressGesture.minimumPressDuration=0.6;
 longPressGesture.delegate=self;
 [cell.view addGestureRecognizer:longPressGesture];
 UITapGestureRecognizer *gesture=[[UITapGestureRecognizer alloc]    initWithTarget:self action:@selector(cellSelected:)];
//[gesture requireGestureRecognizerToFail:longPressGesture]; 
 gesture.delegate=self;
 [cell.view addGestureRecognizer:gesture];

 also you need to set this delegate to work both gesture together
 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer  shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer  *)otherGestureRecognizer 
 {
 return YES;
 }

该方法无法正常工作,因为它被过于频繁地调用了。 - Vyachaslav Gerchicov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接