當前位置:編程學習大全網 - 源碼下載 - iOS-UIGestureRecognizer詳解-原理篇

iOS-UIGestureRecognizer詳解-原理篇

UIGestureRecognizer是蘋果在iOS 3.2之後,推出的手勢識別功能。UIGestureRecognizer是壹個抽象類,將觸摸事件封裝成了手勢對象,大大簡化了開發者的開發難度,同時也提升了用戶的交互體驗。UIGestureRecognizer有七個子類,它們具體實現了不同手勢的功能。

UIGestureRecognizer 是壹個抽象類,所以它會提供很多***有的屬性和方法給子類用,這也是抽象父類的作用。

addTarget方法,允許 壹個手勢對象 可以 添加多個selector方法 ,並且觸發的時候,所有添加的selector都會被執行,我們以點擊手勢示例如下:

先把所有的屬性和方法列舉出來說說作用的,有的屬性是很常用的,就不展開說了,有的屬性不常用,但是比較重要,我就單獨拿出來詳細說壹下。

先來說說 requiresExclusiveTouchType 這個屬性

是不是有很多人和我之前壹樣,把它理解成了設置為NO,就可以同時響應幾種手勢點擊了呢?

這個屬性的意思: 是否同時只接受壹種觸摸類型,而不是是否同時只接受壹種手勢 。默認是YES。設置成NO,它會同時響應 allowedTouchTypes 這個數組裏的所有觸摸類型。這個數組裏面裝的touchType類型如下:

如果把 requiresExclusiveTouchType 設置為NO,假設view上添加了tapGesture手勢,妳同時用手點擊和用觸控筆點擊該view,這個tapGesture手勢的方法都會響應。

接下來說說 cancelsTouchesInView delaysTouchesBegan delaysTouchesEnd 這三個屬性。

cancelsTouchesInView栗子

栗子中,pan.cancelsTouchesInView = YES時,為什麽會打印"touchesMoved調用了"呢?這就涉及到第二個屬性 delaysTouchesBegan ,這是因為手勢識別是有壹個過程的,拖拽手勢需要壹個很小的手指移動的過程才能被識別為拖拽手勢,而在壹個手勢觸發之前,是會壹並發消息給事件傳遞鏈的,所以才會有最開始的幾個touchMoved方法被調用,當識別出拖拽手勢以後,就會終止touch事件的傳遞。 當pan.cancelsTouchsInView = NO,touchesMoved和panHandler依次被打印出來,touch事件繼續響應。

delaysTouchesBegan的栗子

delaysTouchesBegan 設置為YES時,手勢識別成功之前都不會調用touches相關方法,因為手勢識別成功了,所以控制臺只打印了"panHandler 調用了"的信息。如果手勢識別失敗了,就會打印touchesMoved方法裏的信息。

delaysTouchesEnd的栗子

就像上面對這個屬性的分析壹樣 設置為NO,則會立馬調用touchEnd:withEvent這個方法。設置為YES,會等待壹個很短的時間,如果沒有接收到新的手勢識別任務,才會發送touchesEnded消息到事件傳遞鏈。

用法:[A requireGestureRecognizerToFail:B] 當A、B兩個手勢同時滿足響應手勢方法的條件時,B優先響應,A不響應。如果B不滿足條件,A滿足響應手勢方法的條件,則A響應。其實這就是壹個設置響應手勢優先級的方法。

如果壹個view上添加了多個手勢對象的,默認這些手勢是互斥的,壹個手勢觸發了就會默認屏蔽其他手勢動作。比如,單擊和雙擊手勢並存時,如果不做處理,它就只能發送出單擊的消息。為了能夠優先識別雙擊手勢,我們就可以用 requireGestureRecognizerToFail: 這個方法設置優先響應雙擊手勢。

手勢可以分為: "離散手勢" "連續手勢"

"離散手勢" :比如tapGesture、swipeGesture等

"連續手勢" : 比如:panGesture,rotationGesture等。

對於連續手勢,手勢識別器可能使狀態轉換更多,如下圖所示:

可能---->開始----> [已更改] ---->已取消

可能---->開始----> [已更改] ---->結束

在視圖上點擊視圖的手勢------常用度五顆星

在視圖上手指進行縮放的手勢------常用度三顆星

在視圖上手指旋轉的手勢------常用度三顆星

在視圖上用手指進行有方向滑動的手勢------常用度三顆星

在視圖上用手指進行長按的手勢------常用度三顆星

在視圖上用手指進行平移的手勢------常用度四顆星

手指在屏幕四個邊緣平移的手勢------常用度三顆星

從runLoop底層看事件響應和手勢的關系:

如果系統提供的手勢不能滿足妳,妳也可以自定義手勢。自定義手勢需要繼承:UIGestrureRecognizer,並且需要導入頭文件#import <UIKit/UIGestureRecognizerSubclass.h>,實現以下四個方法:

更多自定義手勢內容請看 這裏

關於iOS-UITouch事件處理請看 UITouch事件處理-原理篇

本文借鑒了壹些前輩的文章,如果有不對的地方請指正,歡迎大家壹起交流學習。

  • 上一篇:自己建設網站需要什麽條件
  • 下一篇:直播APP安卓開發大概多少錢
  • copyright 2024編程學習大全網