3.6 iOS手勢識別的狀態和手勢識別器幕后原理

2.2手勢識別的狀態和手勢識別器幕后原理

(一)手勢的狀態

// 手勢狀態
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
    UIGestureRecognizerStatePossible,   // 尚未識別是何種手勢操作(但可能已經觸發了觸摸事件),默認狀態
    UIGestureRecognizerStateBegan,      // 手勢已經開始,此時已經被識別,但是這個過程中可能發生變化,手勢操作尚未完成
    UIGestureRecognizerStateChanged,    // 手勢狀態發生轉變
    UIGestureRecognizerStateEnded,      // 手勢識別操作完成(此時已經松開手指)
    UIGestureRecognizerStateCancelled,  // 手勢被取消,恢復到Possible狀態
    UIGestureRecognizerStateFailed,     // 手勢識別失敗,恢復到Possible狀態
    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手勢識別完成,同UIGestureRecognizerStateEnded
};

(二)離散型手勢識別器和連續型手勢識別器之間的對比:

調用回調方法區別:

14636547400991.png

狀態之間切換區別:
14636543727544.png

總結:離散型手勢一旦識別就無法取消,而且只會調用一次手勢操作事件(初始化手勢時指定的回調方法)。而連續型手勢會多次調用手勢操作事件,而且在連續手勢識別后可以取消手勢.兩者調用回調方法的次數是不同的.

(三)手勢識別器幕后原理
手勢識別器是在正常的響應者鏈條之上.默認情況下,UIWindow首先將觸摸事件發送給手勢識別器,只有手勢識別器無法處理觸摸事件時,事件才會被轉發給響應者鏈條.
應用程序判斷手勢是否別識別的過程:
手勢識別器進入UIGestureRecognizerStatePossible狀態:
離散型手勢:

    1>手勢識別器將判斷手勢處于`UIGestureRecognizerStateRecognized`
      還是`UIGestureRecognizerStateFailed`狀態.
    2>如果是`UIGestureRecognizerStateRecognized`狀態,手勢識別器將處理事件,
      并調用指定的回調方法.
      如果是`UIGestureRecognizerStateFailed`狀態,手識別器將把觸摸事件裝發
      給`響應者鏈條`.

連續型手勢:

    1>手勢識別器將判斷手勢處于`UIGestureRecognizerStateBegan`
      還是`UIGestureRecognizerStateFailed`狀態.
    2>如果手勢處于UIGestureRecognizerStateBegan狀態,手勢識別器將處理事件,并
      調用回調方法.然后當手勢發生變化時,都將進入`UIGestureRecognizerStateChanged`
      狀態,并調用指定的回調方法.這個過程不斷重復,直到觸摸結束并進入`UIGestureRecognizerStateEnded`
      狀態.如果觸摸方式不再符合預期手勢,將進入`UIGestureRecognizerStateCancelled`
      狀態.
      如果手勢處于`UIGestureRecognizerStateFailed`狀態,手勢識別器將把觸摸事件裝發
      給`響應者鏈條`.

經驗談:

手勢從狀態UIGestureRecognizerStatePossible變化到狀態UIGestureRecognizerStateFailed所需的事件可能很長.如果手勢識別器處理觸摸事件的速度慢的莫名其妙,最好在手勢處理方法中輸出相關的狀態,這樣就可以清楚地知道手勢狀態的變換情況,就可以確定延遲出現在什么地方.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 手勢識別器是附加到視圖的對象,將低級別事件處理代碼轉換為更高級別的操作,它允許視圖以控件執行的方式響應操作。 手勢...
    坤坤同學閱讀 4,132評論 0 9
  • 好奇觸摸事件是如何從屏幕轉移到APP內的?困惑于Cell怎么突然不能點擊了?糾結于如何實現這個奇葩響應需求?亦或是...
    Lotheve閱讀 58,028評論 51 603
  • 在iOS開發中經常會涉及到觸摸事件。本想自己總結一下,但是遇到了這篇文章,感覺總結的已經很到位,特此轉載。作者:L...
    WQ_UESTC閱讀 6,133評論 4 26
  • -- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點觸摸的強大功能,喬布斯讓人們認識到手機其實...
    翹楚iOS9閱讀 3,003評論 0 13
  • 概述 手勢識別器是處理視圖中的觸摸或者按壓事件最簡單的方法,我們可以在任意視圖上附加一個或多個手勢識別器。手勢識別...
    漸z閱讀 3,108評論 0 2