iOS開發系列--UITouch與UITapGestureRecognizer的衝突

因爲項目需求,在一個UIView中使用了富文本M80AttributedLabel控件,底層UIView上添加一個UITapGestureRecognizer單擊事件,用於點擊空白處收起鍵盤。
M80AttributedLabel中使用了一個Link跳轉,控件內部使用的是UITouch來作處理的,剛開始調試發現怎麼點都沒法觸發M80AttributedLabelLink跳轉,後來對UITouch事件進行斷點跟蹤,發現ide

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

事件沒法正確執行,而是在調試

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

事件中就中斷了。
通過資料查詢,最後發現是由於底層UIView加了UITapGestureRecognizer
而這個手勢致使了touchesCancelled被觸發從而使觸摸失效。code

解決辦法:
1.經過設置UITapGestureRecognizercancelsTouchesInView屬性。
cancelsTouchesInView的官方描述是「A Boolean value affecting whether touches are delivered to a view when a gesture is recognized.」也就是說,能夠經過設置這個布爾值,來設置手勢被識別時觸摸事件是否被傳送到視圖。
當值爲YES的時候,系統會識別手勢,並取消觸摸事件;爲NO的時候,手勢識別以後,系統將觸發觸摸事件。事件

gestureRecognizer.cancelsTouchesInView = NO;

2.移除底層UIViewUITapGestureRecognizer事件,添加一個UIButton,經過UIButtonUIControlEventTouchUpInside來實現一樣的點擊空白處收起鍵盤。it

相關文章
相關標籤/搜索