iOS中,多手势之间的冲突和解决方案

涉及到手势冲突的问题,网上最常见的有一种方法,在这里先记录下来:
在iOS中,如果一个手势A的识别部分是另一个手势B的子部分时,默认情况下A就会先识别,B就无法识别了。要解决这个冲突可以利用

- (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer;

方法来完成。这个方法可以指定某个手势执行的前提是另一个手势失败才会识别执行。

//解决在图片上滑动时拖动手势和轻扫手势的冲突
[panGesture requireGestureRecognizerToFail:swipeGestureToRight];
[panGesture requireGestureRecognizerToFail:swipeGestureToLeft];
//解决拖动和长按手势之间的冲突
[longPressGesture requireGestureRecognizerToFail:panGesture];

有一个这个方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

可以实现同一视图多个手势操作,这个代理方法默认返回NO,会阻断继续向下识别手势,如果返回YES则可以继续向下传播识别

但是我之前在做的一个图片单击翻页、双击放大的时候,就是点击手势不同的点击次数相互冲突的问题,这个方法不管用,于是我用了下面的这个方法解决的手势冲突问题

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    touch = [touches anyObject];

    NSTimeInterval delaytime = 0.4;//自己根据需要调整
    //这个时间就是多长时间之内,只能识别一个手势进来
    switch (touch.tapCount) {
        case 1:
            [self performSelector:@selector(handleSingleTap:) withObject:nil afterDelay:delaytime];
            //单击执行的方法,有一个时间的延时
            break;
        case 2:
            [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(handleSingleTap:) object:nil];//双击
            [self performSelector:@selector(handleDoubleTap:) withObject:nil afterDelay:delaytime];
            break;
        case 3:
            [self handleTripleTap:touch];
            break;
        default:
            break;
    }
    [[self nextResponder] touchesEnded:touches withEvent:event];

}

只需要在你的代码里加入这一段,然后把点击的手势对应的放到里面的方法里,就解决了点击手势次数冲突的问题了

你可能感兴趣的:(ScrollView,scrollView,手势冲突,多手势问题,点击手势次数问题)