監聽觸摸事件的做法
如果想監聽一個view上面的觸摸事件,之前的做法是
自定義一個view
實現view的touches方法,在方法內部實現具體處理代碼
通過touches方法監聽view觸摸事件,有很明顯的幾個缺點
必須得自定義view
由于是在view內部的touches方法中監聽觸摸事件,因此默認情況下,無法讓其他外界對象監聽view的觸摸事件
不容易區分用戶的具體手勢行為
iOS 3.2之后,蘋果推出了手勢識別功能(Gesture Recognizer),在觸摸事件處理方面,大大簡化了開發者的開發難度
UIGestureRecognizer
為了完成手勢識別,必須借助于手勢識別器—-UIGestureRecognizer
利用UIGestureRecognizer,能輕松識別用戶在某個view上面做的一些常見手勢
UIGestureRecognizer是一個抽象類,定義了所有手勢的基本行為,使用它的子類才能處理具體的手勢
UITapGestureRecognizer(敲擊)
UIPinchGestureRecognizer(捏合,用于縮放)
UIPanGestureRecognizer(拖拽)
UISwipeGestureRecognizer(輕掃)
UIRotationGestureRecognizer(旋轉)
UILongPressGestureRecognizer(長按)
每一個手勢識別器的用法都差不多,比如UITapGestureRecognizer的使用步驟如下
創建手勢識別器對象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
設置手勢識別器對象的具體屬性
// 連續敲擊2次
tap.numberOfTapsRequired = 2;
// 需要2根手指一起敲擊
tap.numberOfTouchesRequired = 2;
添加手勢識別器到對應的view上
[self.iconView addGestureRecognizer:tap];
監聽手勢的觸發
[tap addTarget:self action:@selector(tapIconView:)];
手勢識別的狀態:
typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
// 沒有觸摸事件發生,所有手勢識別的默認狀態
UIGestureRecognizerStatePossible,
// 一個手勢已經開始但尚未改變或者完成時
UIGestureRecognizerStateBegan,
// 手勢狀態改變
UIGestureRecognizerStateChanged,
// 手勢完成
UIGestureRecognizerStateEnded,
// 手勢取消,恢復至Possible狀態
UIGestureRecognizerStateCancelled,
// 手勢失敗,恢復至Possible狀態
UIGestureRecognizerStateFailed,
// 識別到手勢識別
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
};