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