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];

}

只需要在你的代碼里加入這一段,然後把點擊的手勢對應的放到裏面的方法裏,就解決了點擊手勢次數衝突的問題了

發佈了26 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章