iOS 手势冲突
手勢沖突處理
- 1、自定義手勢優先級
- 2、阻止手勢向響應鏈傳遞執行
- 3、實現協議方法 `UIGestureRecognizerDelegate` 控制手勢沖突
- 4、自定義手勢
手勢沖突主要的三種解決思路:
- 設置手勢優先級 requireGestureRecognizerToFail:
- 阻止手勢向事件傳遞鏈執行 cancelsTouchesInView、delaysTouchesBegan
- 實現協議方法 UIGestureRecognizerDelegate
- (自定義手勢)重寫父類中的個別方法 @interface UIGestureRecognizer (UIGestureRecognizerProtected)
1、自定義手勢優先級
場景一:
自定義多手勢沖突。例如我們設置的單次點擊、雙擊和三次點擊手勢,需要設置優先識別三擊手勢,識別失敗后再識別雙擊手勢;同理,雙擊手勢識別失敗后再識別單擊手勢。
2、阻止手勢向響應鏈傳遞執行
當自定義手勢和系統手勢沖突,可以使用手勢的兩個屬性:cancelsTouchesInView、delaysTouchesBegan進行處理。
例如:頁面添加自定義手勢 UIPanGestureRecognizer,與頁面上的系統手勢 touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) 回調方法沖突,可利用該屬性屏蔽掉系統手勢。
- cancelsTouchesInView(是否取消向事件響應鏈傳遞):
默認 YES,自定義的手勢響應后,系統手勢不再響應,但自定義手勢識別前,會先執行系統手勢。
設置為 NO 后,自定義手勢和系統手勢會同時識別響應。 - delaysTouchesBegan(延遲響應鏈的識別):
默認 NO,先執行響應鏈中的方法(系統方法),識別到自定義手勢后,不再執行系統方法。
設置為 YES 后,優先識別自定義手勢,當自定義手勢識別失敗后才會響應系統方法
屏蔽掉系統方法,我們只需要將屬性 delaysTouchesBegan 設置為 YES 即可:
// MARK: - 阻止手勢向事件傳遞鏈傳遞func test_2() {let panGes = UIPanGestureRecognizer(target: self, action: #selector(panGestureAction(panGes:)))// 阻止手勢向事件傳遞鏈執行 默認是 YES// panGes.cancelsTouchesInView = false// 延遲手勢向事件傳遞鏈執行 默認是 NOpanGes.delaysTouchesBegan = trueself.view.addGestureRecognizer(panGes)}@objc func panGestureAction(panGes: UIPanGestureRecognizer) {let point = panGes.location(in: self.view)print("********************")print("W ==> \(point.x)")print("H ==> \(point.y)")}override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {let point = touches.first?.location(in: self.view)print("=====================")print("W ==> \(String(describing: point?.x))")print("H ==> \(String(describing: point?.y))")}3、實現協議方法 UIGestureRecognizerDelegate 控制手勢沖突
常用的是第二個協議方法 gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer:
//手指觸摸屏幕后回調的方法,返回NO則不再進行手勢識別,方法觸發等 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch; //開始進行手勢識別時調用的方法,返回NO則結束,不再觸發手勢 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer; //是否支持多時候觸發,返回YES,則可以多個手勢一起觸發方法,返回NO則為互斥 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; //下面這個兩個方法也是用來控制手勢的互斥執行的 //這個方法返回YES,第一個手勢和第二個互斥時,第一個會失效 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0); //這個方法返回YES,第一個和第二個互斥時,第二個會失效 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);4、自定義手勢
系統提供給我們的手勢可以滿足絕大多數的業務場景需求,對于特殊情況,可能需要用到自定義的手勢。
繼承 UIGestureRecognizer ,并重寫以下方法:
根據其它博客內容提示,如需修改手勢的 state 屬性,需要引入 import UIKit.UIGestureRecognizerSubclass,但根據實測,未引入也不會報錯。
總結
- 上一篇: C语言,使用union了解内存
- 下一篇: ARM指令集与Thumb指令集与Thum