A.系統提供的手勢識別器
1.敲擊手勢 UITapGestureRecognizer
numberOfTapsRequired: 敲擊次數
numberOfTouchesRequired: 同時敲擊觸碰數(手指數)
1 - (void) testTap { 2 // 創建手勢識別器 3 UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRun:)]; 4 tapRec.numberOfTapsRequired = 3; // 觸發需要點擊的次數 5 tapRec.numberOfTouchesRequired = 2; // 觸發需要同時點擊的點數目 6 7 // 配置手勢識別器到控件 8 [self.hvwView addGestureRecognizer: tapRec]; 9 } 10 11 /** tap手勢的事件處理方法 */ 12 - (void) tapRun:(UITapGestureRecognizer *) tapRec { 13 NSLog(@"tapRun"); 14 }
2.長按手勢 UILongPressGestureRecognizer
minimumPressDuration: 長按生效時間
numberOfTouchesRequired: 需要的同時點擊數
numberOfTapsRequired: 需要的點擊次數
allowableMovement: 長按有效移動范圍(從點擊開始,長按移動的允許范圍)
ps:移動的時候會不斷調用目標方法
1 - (void) testLongPress { 2 UILongPressGestureRecognizer *longRec = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressRun:)]; 3 4 longRec.minimumPressDuration = 2; // 長按生效時間 5 longRec.allowableMovement = 50; // 長按允許移動范圍,單位:px 6 7 [self.hvwView addGestureRecognizer:longRec]; 8 }
3.輕掃手勢 UISwipeGestureRecognizer
direction:掃的方向 上下左右
1 typedef enum { 2 UISwipeGestureRecognizerDirectionRight = 1 << 0, 3 UISwipeGestureRecognizerDirectionLeft = 1 << 1, 4 UISwipeGestureRecognizerDirectionUp = 1 << 2, 5 UISwipeGestureRecognizerDirectionDown = 1 << 3 6 } UISwipeGestureRecognizerDirection;
1 - (void) testSwipe { 2 UISwipeGestureRecognizer *swipeRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRun:)]; 3 swipeRec.direction = UISwipeGestureRecognizerDirectionRight; // 輕掃的方向 4 5 [self.hvwView addGestureRecognizer:swipeRec]; 6 }
4.捏合手勢 UIPinchGestureRecognizer
scale: 捏合的距離
1 - (void) testPinch { 2 UIPinchGestureRecognizer *rec = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchRun:)]; 3 4 [self.hvwView addGestureRecognizer:rec]; 5 } 6 7 - (void) pinchRun:(UIPinchGestureRecognizer *) rec { 8 rec.view.transform = CGAffineTransformScale(rec.view.transform, rec.scale, rec.scale); 9 10 // 一定要復位!!!不然按住捏合會不斷疊加倍數 11 rec.scale = 1; 12 }
5.旋轉手勢 UIRotationGestureRecognizer
rotation: 旋轉了的角度
1 - (void) testRotation { 2 UIRotationGestureRecognizer *rotationRec = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationRun:)]; 3 4 [self.hvwView addGestureRecognizer:rotationRec]; 5 } 6 7 - (void) rotationRun:(UIRotationGestureRecognizer *) rec { 8 rec.view.transform = CGAffineTransformRotate(rec.view.transform, rec.rotation); 9 10 // 一定要復位!!!不然會在按住旋轉的時候會不斷疊加rotation 11 rec.rotation = 0; 12 }
6.拖曳手勢 UIPanGestureRecognizer
相對始點拖曳距離:[pan translationInView:pan.view]
1 - (void) testPan { 2 UIPanGestureRecognizer *rec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRun:)]; 3 4 [self.hvwView addGestureRecognizer:rec]; 5 } 6 7 - (void) panRun:(UIPanGestureRecognizer *) rec { 8 // 取得拖曳距離 9 CGPoint movedDistance = [rec translationInView:rec.view]; 10 CGPoint viewCenter = rec.view.center; 11 viewCenter.x += movedDistance.x; 12 viewCenter.y += movedDistance.y; 13 rec.view.center = viewCenter; 14 15 // 復位拖曳距離 16 [rec setTranslation:CGPointZero inView:rec.view]; 17 }
B.一般情況只能使用一個識別器,使用代理設置才能同時使用多個識別器
1.遵守協議:
1 @interface ViewController () <UIGestureRecognizerDelegate>
2.給需要同時進行識別的手勢識別器設置代理
1 rec.delegate = self;
3.實現手勢識別器同時使用方法
1 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 2 3 // 任何兩種手勢識別器都能同時使用 4 return YES; 5 }
1 // 2 // ViewController.m 3 // GestureRecognizerTest 4 // 5 // Created by hellovoidworld on 15/1/13. 6 // Copyright (c) 2015年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController () <UIGestureRecognizerDelegate> 12 13 @property (weak, nonatomic) IBOutlet UIView *hvwView; 14 15 @end 16 17 @implementation ViewController 18 19 - (void)viewDidLoad { 20 [super viewDidLoad]; 21 // Do any additional setup after loading the view, typically from a nib. 22 23 // [self testTap]; 24 // [self testLongPress]; 25 // [self testSwipe]; 26 [self testRotation]; 27 [self testPinch]; 28 [self testPan]; 29 } 30 31 - (void) testTap { 32 // 創建手勢識別器 33 UITapGestureRecognizer *tapRec = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRun:)]; 34 tapRec.numberOfTapsRequired = 3; // 觸發需要點擊的次數 35 tapRec.numberOfTouchesRequired = 2; // 觸發需要同時點擊的點數目 36 37 // 配置手勢識別器到控件 38 [self.hvwView addGestureRecognizer: tapRec]; 39 } 40 41 /** tap手勢的事件處理方法 */ 42 - (void) tapRun:(UITapGestureRecognizer *) tapRec { 43 NSLog(@"tapRun"); 44 } 45 46 - (void) testLongPress { 47 UILongPressGestureRecognizer *longRec = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressRun:)]; 48 49 longRec.minimumPressDuration = 2; // 長按生效時間 50 longRec.allowableMovement = 50; // 長按允許移動范圍,單位:px 51 52 [self.hvwView addGestureRecognizer:longRec]; 53 } 54 55 - (void) longPressRun:(UILongPressGestureRecognizer *) rec { 56 NSLog(@"longPress"); 57 } 58 59 - (void) testSwipe { 60 UISwipeGestureRecognizer *swipeRec = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRun:)]; 61 swipeRec.direction = UISwipeGestureRecognizerDirectionRight; // 輕掃的方向 62 63 [self.hvwView addGestureRecognizer:swipeRec]; 64 } 65 66 - (void) swipeRun:(UISwipeGestureRecognizer *) rec { 67 NSLog(@"swipe"); 68 } 69 70 - (void) testRotation { 71 UIRotationGestureRecognizer *rotationRec = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationRun:)]; 72 rotationRec.delegate = self; 73 74 [self.hvwView addGestureRecognizer:rotationRec]; 75 } 76 77 - (void) rotationRun:(UIRotationGestureRecognizer *) rec { 78 rec.view.transform = CGAffineTransformRotate(self.hvwView.transform, rec.rotation); 79 80 // 一定要復位!!!不然會在按住旋轉的時候會不斷疊加rotation 81 rec.rotation = 0; 82 } 83 84 - (void) testPinch { 85 UIPinchGestureRecognizer *rec = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchRun:)]; 86 rec.delegate = self; 87 88 [self.hvwView addGestureRecognizer:rec]; 89 } 90 91 - (void) pinchRun:(UIPinchGestureRecognizer *) rec { 92 rec.view.transform = CGAffineTransformScale(rec.view.transform, rec.scale, rec.scale); 93 94 // 一定要復位!!!不然按住捏合會不斷疊加倍數 95 rec.scale = 1; 96 } 97 98 - (void) testPan { 99 UIPanGestureRecognizer *rec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRun:)]; 100 rec.delegate = self; 101 102 [self.hvwView addGestureRecognizer:rec]; 103 } 104 105 - (void) panRun:(UIPanGestureRecognizer *) rec { 106 // 取得拖曳距離 107 CGPoint movedDistance = [rec translationInView:rec.view]; 108 CGPoint viewCenter = rec.view.center; 109 viewCenter.x += movedDistance.x; 110 viewCenter.y += movedDistance.y; 111 rec.view.center = viewCenter; 112 113 // 復位拖曳距離 114 [rec setTranslation:CGPointZero inView:rec.view]; 115 } 116 117 - (void)didReceiveMemoryWarning { 118 [super didReceiveMemoryWarning]; 119 // Dispose of any resources that can be recreated. 120 } 121 122 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 123 124 // 任何兩種手勢識別器都能同時使用 125 return YES; 126 } 127 128 @end
#mark:
因為使用的是transform形變進行縮放、旋轉,所以再進行拖曳的時候是不能正常進行的。