iOS中,多手勢之間的衝突和解決方案
阿新 • • 發佈:2019-01-31
涉及到手勢衝突的問題,網上最常見的有一種方法,在這裡先記錄下來:
在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];
}
只需要在你的程式碼里加入這一段,然後把點選的手勢對應的放到裡面的方法裡,就解決了點選手勢次數衝突的問題了