iOS 手勢操作

黑暗森林的歌者發表於2018-02-26

##1、UIGestureRecognizer 介紹

手勢識別在 iOS 中非常重要,他極大地提高了移動裝置的使用便捷性。 iOS 系統在 3.2 以後,他提供了一些常用的手勢(UIGestureRecognizer 的子類),開發者可以直接使用他們進行手勢操作。

UIPanGestureRecognizer(拖動)
UIPinchGestureRecognizer(捏合)
UIRotationGestureRecognizer(旋轉)
UITapGestureRecognizer(點按)
UILongPressGestureRecognizer(長按)
UISwipeGestureRecognizer(輕掃)
複製程式碼

另外,可以通過繼承 UIGestureRecognizer 類,實現自定義手勢(手勢識別器類)。 PS:自定義手勢時,需要 #import ,一般需實現如下方法:

-(void)reset;
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
//以上方法在分類 UIGestureRecognizer (UIGestureRecognizerProtected) 中宣告,更多方法宣告請自行檢視
複製程式碼

UIGestureRecognizer 的繼承關係如下:

766f2de.jpg

##2、手勢狀態 在六種手勢識別中,只有一種手勢是離散型手勢,他就是 UITapGestureRecognizer。

離散型手勢的特點就是:一旦識別就無法取消,而且只會呼叫一次手勢操作事件(初始化手勢時指定的回撥方法)。

換句話說其他五種手勢是連續型手勢,而連續型手勢的特點就是:會多次呼叫手勢操作事件,而且在連續手勢識別後可以取消手勢。從下圖可以看出兩者呼叫操作事件的次數是不同的:

16eab74.jpg

手勢狀態列舉如下:

typedef NS_ENUM(NSInteger, UIGestureRecognizerState){
UIGestureRecognizerStatePossible,   // 尚未識別是何種手勢操作(但可能已經觸發了觸控事件),預設狀態
UIGestureRecognizerStateBegan,      // 手勢已經開始,此時已經被識別,但是這個過程中可能發生變化,手勢操作尚未完成
UIGestureRecognizerStateChanged,    // 手勢狀態發生轉變
UIGestureRecognizerStateEnded,      // 手勢識別操作完成(此時已經鬆開手指)
UIGestureRecognizerStateCancelled,  // 手勢被取消,恢復到預設狀態UIGestureRecognizerStateFailed,     // 手勢識別失敗,恢復到預設狀態UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手勢識別完成,同UIGestureRecognizerStateEnded
};
複製程式碼
  • 對於離散型手勢 UITapGestureRecgnizer 要麼被識別,要麼失敗,點按(假設點按次數設定為1,並且沒有新增長按手勢)下去一次不鬆開則此時什麼也不會發生,鬆開手指立即識別並呼叫操作事件,並且狀態為3(已完成)。

  • 但是連續型手勢要複雜一些,就拿旋轉手勢來說,如果兩個手指點下去不做任何操作,此時並不能識別手勢(因為我們還沒旋轉)但是其實已經觸發了觸控開始事件, 此時處於狀態0;如果此時旋轉會被識別,也就會呼叫對應的操作事件,同時狀態變成1(手勢開始),但是狀態1只有一瞬間;緊接著狀態變為2(因為我們的旋 轉需要持續一會),並且重複呼叫操作事件(如果在事件中列印狀態會重複列印2);鬆開手指,此時狀態變為3,並呼叫1次操作事件。

##3、使用手勢的步驟 使用手勢很簡單,分為三步:

建立手勢識別器物件例項。建立時,指定一個回撥方法,當手勢開始,改變、或結束時,執行回撥方法。 設定手勢識別器物件例項的相關屬性(可選部分)新增到需要識別的 View 中。 每個手勢只對應一個 View,當螢幕觸控在 View 的邊界內時,如果手勢和預定的一樣,那就會執行回撥方法。

PS:一個手勢只能對應一個 View,但是一個 View 可以有多個手勢。建議在真機上測試這些手勢,模擬器操作不太方便,可能導致認為手勢失效的情況。(模擬器測試捏合和旋轉手勢時,按住 option 鍵,再用觸控板或滑鼠操作)

[參考]http://www.cnblogs.com/huangjianwu/p/4675648.html

相關文章