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