手勢,手勢響應(yīng)GestureRecognizer
關(guān)于手勢響應(yīng)IOS中封裝了一個類,能響應(yīng)一般手勢UIGestureRecognizer
UIGestureRecognizerState的定義如下:
typedef enum {
UIGestureRecognizerStatePossible,
UIGestureRecognizerStateBegan,
UIGestureRecognizerStateChanged,
UIGestureRecognizerStateEnded,
UIGestureRecognizerStateCancelled,
UIGestureRecognizerStateFailed,
UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
} UIGestureRecognizerState;
Possible: 識別器在未識別出它的手勢,但可能會接收到觸摸時處于這個狀態(tài)。這是默認(rèn)狀態(tài)。
Began: 識別器接收到觸摸并識別出是它的手勢時處于這個狀態(tài)。響應(yīng)方法將在下個循環(huán)步驟中被調(diào)用。
Changed:the recognizer has received touches recognized as a change to the gesture. (不懂怎么翻譯,理解上就是識別器識別出一個變化為它的手勢的觸摸),響應(yīng)方法將在下個循環(huán)步驟中被調(diào)用。
Ended:識別器在識別到作為當(dāng)前手勢結(jié)束信號的觸摸時處于這個狀態(tài)。響應(yīng)方法將在下個循環(huán)步驟中被調(diào)用 并且 識別器將重置為possible狀態(tài)。
Cancelled:識別器處于取消狀態(tài).響應(yīng)方法將在下個循環(huán)步驟中被調(diào)用 并且 識別器將重置為possible狀態(tài)。
Failed: 識別器接收到不能識別為它的手勢的一系列觸摸。響應(yīng)方法不會被調(diào)用 并且 識別器將重置為possible狀態(tài)。
Recognized: 識別器已識別到它的手勢。響應(yīng)方法將在下個循環(huán)步驟中被調(diào)用 并且 識別器將重置為possible狀態(tài)。
下面說一下這個UIGestureRecognizer 類
這個類有幾個子類,這幾個子類分別表示幾種不同的基本手勢
1、UITapGestureRecognizer //點擊手勢識別器,可以是點擊一次,或多次都能識別
2、UIPinchGestureRecognizer //捏合手勢識別器,用于視圖的放大縮小
3、UIRotationGestureRecognizer //旋轉(zhuǎn)手勢識別器
4、UISwipeGestureRecognizer //滑動手勢識別器,向上、下、左、右滑動
5、UIPanGestureRecognizer //拖動手勢識別器
6、UILongPressGestureRecognizer //長按手勢識別器,常見的有長按跳出一個界面用以編輯
手勢狀態(tài)枚舉:
1 typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
2? ? UIGestureRecognizerStatePossible,? // 尚未識別是何種手勢操作(但可能已經(jīng)觸發(fā)了觸摸事件),默認(rèn)狀態(tài)
3? ? UIGestureRecognizerStateBegan,? ? ? // 手勢已經(jīng)開始,此時已經(jīng)被識別,但是這個過程中可能發(fā)生變化,手勢操作尚未完成
4? ? UIGestureRecognizerStateChanged,? ? // 手勢狀態(tài)發(fā)生轉(zhuǎn)變
5? ? UIGestureRecognizerStateEnded,? ? ? // 手勢識別操作完成(此時已經(jīng)松開手指)
6? ? UIGestureRecognizerStateCancelled,? // 手勢被取消,恢復(fù)到默認(rèn)狀態(tài)
7? ? UIGestureRecognizerStateFailed,? ? // 手勢識別失敗,恢復(fù)到默認(rèn)狀態(tài)
8? ? UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded // 手勢識別完成,同UIGestureRecognizerStateEnded
9 };
添加點擊手勢:
UITapGestureRecognizer *click1 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(click1:)];
//設(shè)置這個點擊手勢識別器所能響應(yīng)的點擊次數(shù),單擊所以設(shè)成1,如果想雙擊,就設(shè)置為2,以此類推
click1.numberOfTapsRequired = 1;
//添加手勢到視圖上
[self.view addGestureRecognizer:click1];
//當(dāng)有單擊手勢click1和雙擊手勢click2的時候,需要加下面的代碼用來判斷,優(yōu)先判斷誰來響應(yīng)方法
[click1 requireGestureRecognizerToFail:click2];
然后實現(xiàn)方法click1:就可以了
-(void)click1:(UITapGestureRecognizer *)sender{
}
添加滑動手勢:
UISwipeGestureRecognizer *huaDong = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(huaDong:)];
//設(shè)置能識別滑動手勢的方向,注意一個手勢識別器只能識別一個方向上的滑動
huaDong.direction = UISwipeGestureRecognizerDirectionLeft;
huaDong.direction = UISwipeGestureRecognizerDirectionRight;
huaDong.direction = UISwipeGestureRecognizerDirectionUp;
huaDong.direction = UISwipeGestureRecognizerDirectionDown;
//添加手勢到視圖上
[self.view addGestureRecognizer:huaDong];
然后實現(xiàn)huaDong:方法就好了
-(void)huaDong:(UISwipeGestureRecognizer *)sender{
}
添加長按手勢:
UILongPressGestureRecognizer *longClick = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longClick:)];
//設(shè)置長按多少秒后才識別這個手勢
longClick.minimumPressDuration = 2;
//添加手勢到視圖上
[self.view addGestureRecognizer:longClick];
然后實現(xiàn)longClick:方法就好了
-(void)longClick:(UILongPressGestureRecognizer *)sender{
}
添加移動手勢:
UIPanGestureRecognizer *move = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGesture:)];
//添加手勢到視圖上
[self.view addGestureRecognizer:move];
可以根據(jù)平移時的位置的移動來拖動視圖,獲取位置,用這個方法可以獲取到當(dāng)前移動到得位置
?CGPoint point = [move locationInView:self.view];
添加捏合手勢:
捏合有兩個屬性
@property (nonatomic,readonly) CGFloat velocity;// 捏合的速度
@property (nonatomic) CGFloat scale;// 比例(經(jīng)常用到放縮比例) 這個屬性默認(rèn)值是1
//添加捏合手勢
UIPinchGestureRecognizer *nieHe = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(nieHe:)];
[self.view addGestureRecognizer:nieHe];
添加旋轉(zhuǎn)手勢:
旋轉(zhuǎn)也由兩個屬性
@property (nonatomic) CGFloat rotation; //旋轉(zhuǎn)角度
@property (nonatomic,readonly) CGFloat velocity; //旋轉(zhuǎn)速度
這個主要通過獲取旋轉(zhuǎn)角度來完成一些列操作
//添加旋轉(zhuǎn)手勢識別器
UIRotationGestureRecognizer *xuanZhuan = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(xuanZhuan:)];
[self.view addGestureRecognizer:xuanZhuan];
下面是一個完整的DEMO,直接拷貝到ViewController.m文件可以直接測試:
#import "ViewController.h"
@interface ViewController ()
// 比例(經(jīng)常用到放縮比例) 這個屬性默認(rèn)值是1
@property (nonatomic) CGFloat scale;
// 捏合的速度/旋轉(zhuǎn)速度(這個不需要設(shè)置)
@property (nonatomic,readonly) CGFloat velocity;
// 旋轉(zhuǎn)角度
@property (nonatomic) CGFloat rotation;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self nieHe];
}
#pragma mark 旋轉(zhuǎn)手勢
-(void)xuanZhuan{
// 添加一個旋轉(zhuǎn)手勢識別器
UIRotationGestureRecognizer *xuanZhuan = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(xuanZhuan:)];
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(20, 50, 300, 400)];
view.backgroundColor = [UIColor redColor];
[view addGestureRecognizer:xuanZhuan];
[self.view addSubview:view];
}
-(void)xuanZhuan:(UIRotationGestureRecognizer *)sender{
sender.view.transform = CGAffineTransformRotate(sender.view.transform, sender.rotation);
sender.rotation = 0;
NSLog(@"旋轉(zhuǎn)了!!!");
}
#pragma mark 捏合手勢
-(void)nieHe{
// 添加一個捏合手勢識別器
UIPinchGestureRecognizer *nieHe = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(nieHe:)];
// 將手勢添加到視圖上面
[self.view addGestureRecognizer:nieHe];
}
-(void)nieHe:(UIPinchGestureRecognizer *)sender{
// 設(shè)置視圖如何變化
sender.view.transform = CGAffineTransformScale(sender.view.transform, sender.scale, sender.scale);
// 最好寫上這句話,測試的時候,你會發(fā)現(xiàn)視圖找不到了。??
sender.scale = 1;
NSLog(@"捏合啦!!");
}
#pragma mark 移動手勢
-(void)move{
// 添加一個移動手勢識別器
UIPanGestureRecognizer *move = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(move:)];
// 添加一個view用來方便的調(diào)試
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 50, 50)];
// 設(shè)置view的背景顏色為紅色
view.backgroundColor = [UIColor redColor];
// 給view添加移動手勢
[view addGestureRecognizer:move];
// 將view添加到視圖上面
[self.view addSubview:view];
}
-(void)move:(UIPanGestureRecognizer *)sender{
// 用這個方法可以獲取到當(dāng)前手勢移動到得位置
CGPoint point = [sender locationInView:self.view];
// 可以根據(jù)平移時的位置的移動來拖動視圖(改變視圖的Center)
sender.view.center = CGPointMake(point.x,point.y);
NSLog(@"移動到了(%f,%f)這個點",point.x,point.y);
}
#pragma mark 長按手勢
-(void)changClick{
// 添加一個長按手勢識別器
UILongPressGestureRecognizer *longClick = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longClick:)];
// 設(shè)置長按多少秒后才識別這個手勢
longClick.minimumPressDuration = 2;
// 添加手勢到視圖上
[self.view addGestureRecognizer:longClick];
}
-(void)longClick:(UILongPressGestureRecognizer *)sender{
NSLog(@"長按了!!!");
}
#pragma mark 左側(cè)滑動手勢
-(void)huaDongShouShi{
// 添加一個滑動手勢識別器
UISwipeGestureRecognizer *huaDongLeft = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(huaDongLeft:)];
// 添加一個滑動手勢識別器
UISwipeGestureRecognizer *huaDongRight = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(huaDongRight:)];
// 添加一個滑動手勢識別器
UISwipeGestureRecognizer *huaDongUp = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(huaDongUp:)];
// 添加一個滑動手勢識別器
UISwipeGestureRecognizer *huaDongDown = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(huaDongDown:)];
// 設(shè)置能識別滑動手勢的方向,注意一個手勢識別器只能識別一個方向上的滑動,以左側(cè)滑動為例子(如果想多方向監(jiān)聽滑動,可以多添加幾個手勢識別器)
// 左側(cè)滑動
huaDongLeft.direction = UISwipeGestureRecognizerDirectionLeft;
// 右側(cè)滑動
huaDongRight.direction = UISwipeGestureRecognizerDirectionRight;
// 向上滑動
huaDongUp.direction = UISwipeGestureRecognizerDirectionUp;
// 向下滑動
huaDongDown.direction = UISwipeGestureRecognizerDirectionDown;
// 添加手勢到視圖上
[self.view addGestureRecognizer:huaDongLeft];
[self.view addGestureRecognizer:huaDongRight];
[self.view addGestureRecognizer:huaDongUp];
[self.view addGestureRecognizer:huaDongDown];
}
-(void)huaDongLeft:(UISwipeGestureRecognizer *)sender{
NSLog(@"左滑了一下");
}
-(void)huaDongRight:(UISwipeGestureRecognizer *)sender{
NSLog(@"右滑了一下");
}
-(void)huaDongUp:(UISwipeGestureRecognizer *)sender{
NSLog(@"上滑了一下");
}
-(void)huaDongDown:(UISwipeGestureRecognizer *)sender{
NSLog(@"下滑了一下");
}
#pragma mark 點擊手勢
-(void)dianJiShouShi{
// 添加一個單擊手勢識別器
UITapGestureRecognizer *click1 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(click1:)];
// 其中1代表點擊1次相應(yīng)方法
click1.numberOfTapsRequired = 1;
// 添加一個雙擊手勢識別器
UITapGestureRecognizer *click2 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(click2:)];
// 其中2代表點擊2次相應(yīng)方法
click2.numberOfTapsRequired = 2;
// 將手勢添加到視圖上
[self.view addGestureRecognizer:click1];
[self.view addGestureRecognizer:click2];
// 這句話是關(guān)鍵,用來設(shè)置優(yōu)先考慮響應(yīng)哪個手勢
[click1 requireGestureRecognizerToFail:click2];
}
-(void)click1:(UITapGestureRecognizer *)sender{
NSLog(@"單擊了一下");
}
-(void)click2:(UITapGestureRecognizer *)sender{
NSLog(@"雙擊了一下");
}