2.2手勢識別的狀態(tài)和手勢識別器幕后原理
(一)手勢的狀態(tài)
// 手勢狀態(tài)
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
UIGestureRecognizerStatePossible, // 尚未識別是何種手勢操作(但可能已經(jīng)觸發(fā)了觸摸事件)匿醒,默認(rèn)狀態(tài)
UIGestureRecognizerStateBegan, // 手勢已經(jīng)開始嘁信,此時已經(jīng)被識別侦镇,但是這個過程中可能發(fā)生變化,手勢操作尚未完成
UIGestureRecognizerStateChanged, // 手勢狀態(tài)發(fā)生轉(zhuǎn)變
UIGestureRecognizerStateEnded, // 手勢識別操作完成(此時已經(jīng)松開手指)
UIGestureRecognizerStateCancelled, // 手勢被取消拧篮,恢復(fù)到Possible狀態(tài)
UIGestureRecognizerStateFailed, // 手勢識別失敗,恢復(fù)到Possible狀態(tài)
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手勢識別完成,同UIGestureRecognizerStateEnded
};
(二)離散型手勢識別器和連續(xù)型手勢識別器之間的對比:
調(diào)用回調(diào)方法區(qū)別:
狀態(tài)之間切換區(qū)別:
總結(jié):離散型手勢一旦識別就無法取消数苫,而且只會調(diào)用一次手勢操作事件(初始化手勢時指定的回調(diào)方法)。而連續(xù)型手勢會多次調(diào)用手勢操作事件辨液,而且在連續(xù)手勢識別后可以取消手勢.兩者調(diào)用回調(diào)方法的次數(shù)是不同的.
(三)手勢識別器幕后原理
手勢識別器是在正常的響應(yīng)者鏈條
之上.默認(rèn)情況下,UIWindow首先將觸摸事件發(fā)送給手勢識別器,只有手勢識別器無法處理觸摸事件時,事件才會被轉(zhuǎn)發(fā)給響應(yīng)者鏈條
.
應(yīng)用程序判斷手勢是否別識別的過程:
手勢識別器進(jìn)入UIGestureRecognizerStatePossible
狀態(tài):
離散型手勢:
1>手勢識別器將判斷手勢處于`UIGestureRecognizerStateRecognized`
還是`UIGestureRecognizerStateFailed`狀態(tài).
2>如果是`UIGestureRecognizerStateRecognized`狀態(tài),手勢識別器將處理事件,
并調(diào)用指定的回調(diào)方法.
如果是`UIGestureRecognizerStateFailed`狀態(tài),手識別器將把觸摸事件裝發(fā)
給`響應(yīng)者鏈條`.
連續(xù)型手勢:
1>手勢識別器將判斷手勢處于`UIGestureRecognizerStateBegan`
還是`UIGestureRecognizerStateFailed`狀態(tài).
2>如果手勢處于UIGestureRecognizerStateBegan狀態(tài),手勢識別器將處理事件,并
調(diào)用回調(diào)方法.然后當(dāng)手勢發(fā)生變化時,都將進(jìn)入`UIGestureRecognizerStateChanged`
狀態(tài),并調(diào)用指定的回調(diào)方法.這個過程不斷重復(fù),直到觸摸結(jié)束并進(jìn)入`UIGestureRecognizerStateEnded`
狀態(tài).如果觸摸方式不再符合預(yù)期手勢,將進(jìn)入`UIGestureRecognizerStateCancelled`
狀態(tài).
如果手勢處于`UIGestureRecognizerStateFailed`狀態(tài),手勢識別器將把觸摸事件裝發(fā)
給`響應(yīng)者鏈條`.
經(jīng)驗(yàn)談:
手勢從狀態(tài)
UIGestureRecognizerStatePossible
變化到狀態(tài)UIGestureRecognizerStateFailed
所需的事件可能很長.如果手勢識別器處理觸摸事件的速度慢的莫名其妙,最好在手勢處理方法中輸出相關(guān)的狀態(tài),這樣就可以清楚地知道手勢狀態(tài)的變換情況,就可以確定延遲出現(xiàn)在什么地方.