1 // 2 // ViewController.m 3 // testGestures 4 // 5 // Created by shawn li on 13-7-29. 6 // Copyright (c) 2013年 bigbellshawn. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface ViewController () 12 @property (nonatomic, strong) UIImageView *imageView; 13 @end 14 15 @implementation ViewController 16 17 @synthesize imageView = _imageView; 18 19 - (void)viewDidLoad 20 { 21 [super viewDidLoad]; 22 /* step1: 声明和初始化一个手势识别器 */ 23 UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 24 UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)]; 25 UITapGestureRecognizer *twoFingerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerTap:)]; 26 // 坑:selector不小心忘了写冒号,导致找不到handleSwipe */ 27 UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)]; 28 UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)]; 29 UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotation:)]; 30 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; 31 UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)]; 32 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 33 34 /* step2:对手势识别器进行属性设定 */ 35 [doubleTap setNumberOfTapsRequired:2]; 36 // 坑:twoFingerTap在模拟器上不灵敏,有时候会识别成singleTap 37 [twoFingerTap setNumberOfTouchesRequired:2]; 38 39 [swipeLeft setNumberOfTouchesRequired:1]; 40 [swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft]; 41 [swipeRight setNumberOfTouchesRequired:1]; 42 [swipeRight setDirection:UISwipeGestureRecognizerDirectionRight]; 43 44 // 坑:此部分代码无用 注:left、right、up、down都是独立的手势,没法一个swipe全代替,如果只有一个swipe默认向右划 45 /* 46 UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipe:)]; 47 [swipe setNumberOfTouchesRequired:1]; 48 [swipe setDirection:UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown]; 49 50 [self.view addGestureRecognizer:swipe]; 51 */ 52 53 54 /* step3:把手势识别器加到view中去 */ 55 [self.view addGestureRecognizer:singleTap]; 56 [self.view addGestureRecognizer:doubleTap]; 57 [self.view addGestureRecognizer:twoFingerTap]; 58 [self.view addGestureRecognizer:swipeLeft]; 59 [self.view addGestureRecognizer:swipeRight]; 60 [self.view addGestureRecognizer:rotation]; 61 [self.view addGestureRecognizer:pan]; 62 [self.view addGestureRecognizer:pinch]; 63 [self.view addGestureRecognizer:longPress]; 64 65 /* step4:出现冲突时,要设定优先识别顺序,目前只是doubleTap、swipe */ 66 [singleTap requireGestureRecognizerToFail:doubleTap]; 67 [singleTap requireGestureRecognizerToFail:twoFingerTap]; 68 [pan requireGestureRecognizerToFail:swipeRight]; 69 [pan requireGestureRecognizerToFail:swipeLeft]; 70 71 72 _imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 120, 100, 40)]; 73 [self.view addSubview:_imageView]; 74 75 } 76 77 - (void)didReceiveMemoryWarning 78 { 79 [super didReceiveMemoryWarning]; 80 // Dispose of any resources that can be recreated. 81 } 82 83 84 #pragma mark handle gestures methods 85 86 /* step5:去实现处理扑捉到手势之后的动作 */ 87 88 /* 识别单击 */ 89 - (void)handleSingleTap:(UITapGestureRecognizer *)gestureRecognizer { 90 CGPoint location = [gestureRecognizer locationInView:self.view]; 91 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:@"singleTap"]; 92 93 [UIView animateWithDuration:0.5 animations:^{ 94 self.imageView.alpha = 0.0; 95 }]; 96 } 97 98 /* 识别双击 */ 99 - (void)handleDoubleTap:(UITapGestureRecognizer *)gestureRecognizer { 100 CGPoint location = [gestureRecognizer locationInView:self.view]; 101 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:@"doubleTap"]; 102 103 [UIView animateWithDuration:0.5 animations:^{ 104 self.imageView.alpha = 0.0; 105 }]; 106 } 107 108 /* 识别两个手指击 */ 109 - (void)handleTwoFingerTap:(UITapGestureRecognizer *)gestureRecognizer { 110 CGPoint location = [gestureRecognizer locationInView:self.view]; 111 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:@"twoFingerTap"]; 112 113 [UIView animateWithDuration:0.5 animations:^{ 114 self.imageView.alpha = 0.0; 115 }]; 116 } 117 118 /* 识别侧滑 */ 119 - (void)handleSwipe:(UISwipeGestureRecognizer *)gestureRecognizer { 120 CGPoint location = [gestureRecognizer locationInView:self.view]; 121 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:nil]; 122 123 if (gestureRecognizer.direction == UISwipeGestureRecognizerDirectionLeft) { 124 location.x -= 220.0; 125 } 126 else if (gestureRecognizer.direction == UISwipeGestureRecognizerDirectionUp) { 127 location.x -= 220.0; 128 } 129 else if (gestureRecognizer.direction == UISwipeGestureRecognizerDirectionDown) { 130 location.x -= 220.0; 131 } 132 else{ 133 location.x += 220.0; 134 } 135 136 [UIView animateWithDuration:0.5 animations:^{ 137 self.imageView.alpha = 0.0; 138 self.imageView.center = location; 139 }]; 140 } 141 142 /* 识别翻转 */ 143 - (void)handleRotation:(UIRotationGestureRecognizer *)gestureRecognizer { 144 145 CGPoint location = [gestureRecognizer locationInView:self.view]; 146 147 CGAffineTransform transform = CGAffineTransformMakeRotation([gestureRecognizer rotation]); 148 self.imageView.transform = transform; 149 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:nil]; 150 151 if (([gestureRecognizer state] == UIGestureRecognizerStateEnded) || ([gestureRecognizer state] == UIGestureRecognizerStateCancelled)) { 152 [UIView animateWithDuration:0.5 animations:^{ 153 self.imageView.alpha = 0.0; 154 self.imageView.transform = CGAffineTransformIdentity; 155 }]; 156 } 157 158 } 159 160 /* 识别拖动 */ 161 - (void)handlePan:(UIPanGestureRecognizer *)gestureRecognizer { 162 CGPoint location = [gestureRecognizer locationInView:self.view]; 163 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:nil]; 164 //gestureRecognizer.view.center = CGPointMake(gestureRecognizer.view.center.x + location.x, gestureRecognizer.view.center.y + location.y); 165 [gestureRecognizer setTranslation:location inView:self.view]; 166 } 167 168 /* 识别放大缩小 */ 169 - (void)handlePinch:(UIPinchGestureRecognizer *)gestureRecognizer { 170 CGPoint location = [gestureRecognizer locationInView:self.view]; 171 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:nil]; 172 gestureRecognizer.view.transform = CGAffineTransformScale(gestureRecognizer.view.transform, gestureRecognizer.scale, gestureRecognizer.scale); 173 gestureRecognizer.scale = 1; 174 } 175 176 /* 识别长按 */ 177 - (void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { 178 CGPoint location = [gestureRecognizer locationInView:self.view]; 179 [self drawImageForGestureRecognizer:gestureRecognizer atPoint:location underAdditionalSituation:nil]; 180 181 } 182 #pragma mark - 183 #pragma mark Drawing the image view 184 185 /* 186 Set the appropriate image for the image view for the given gesture recognizer, move the image view to the given point, then dispay the image view by setting its alpha to 1.0. 187 */ 188 - (void)drawImageForGestureRecognizer:(UIGestureRecognizer *)recognizer 189 atPoint:(CGPoint)centerPoint underAdditionalSituation:(NSString *)addtionalSituation{ 190 191 NSString *imageName; 192 193 if ([recognizer isMemberOfClass:[UITapGestureRecognizer class]]) { 194 if ([addtionalSituation isEqualToString:@"singleTap"]) { 195 imageName = @"tap.gif"; 196 } 197 else if ([addtionalSituation isEqualToString:@"doubleTap"]){ 198 imageName = @"tap2.gif"; 199 } 200 else if ([addtionalSituation isEqualToString:@"twoFingerTap"]){ 201 imageName = @"twoFingerTap.gif"; 202 } 203 else{ 204 imageName = @"error.png"; 205 } 206 } 207 else if ([recognizer isMemberOfClass:[UIRotationGestureRecognizer class]]) { 208 imageName = @"rotation.gif"; 209 } 210 else if ([recognizer isMemberOfClass:[UISwipeGestureRecognizer class]]) { 211 imageName = @"swipe.gif"; 212 } 213 else if ([recognizer isMemberOfClass:[UIPinchGestureRecognizer class]]) { 214 imageName = @"pinch.gif"; 215 } 216 else if ([recognizer isMemberOfClass:[UIPanGestureRecognizer class]]) { 217 imageName = @"pan.gif"; 218 } 219 else if ([recognizer isMemberOfClass:[UILongPressGestureRecognizer class]]) { 220 imageName = @"longPress.gif"; 221 } 222 else { 223 imageName = @"error.png"; 224 } 225 226 self.imageView.image = [UIImage imageNamed:imageName]; 227 self.imageView.center = centerPoint; 228 self.imageView.alpha = 1.0; 229 } 230 @end