UIGestureRecognizer(手势)、touch(触摸)
1 // touch(触摸)、和手势 2 // 手势核心就是设置delegate和在需要手势监测的view上使用addGestureRecognizer添加指定的手势监测 3 #import "ViewController.h" 4 @interface ViewController ()<UIGestureRecognizerDelegate> // 添加手势代理协议 5 { 6 /** 定义UIImageView类型全局变量image */ 7 UIImageView* image; 8 } 9 10 // touch的四种方法 (3.2以前主要使用这四种方法) touch可以用来自定义手势 11 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; // 开始 12 //{ 13 // UITouch* touch = [touches anyObject]; // 点击对象 14 // CGPoint poin = [touch locationInView:self]; // 获取点击位置 15 //} 16 -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; // 解除,取消 17 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; // 结束 18 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; // 移动 19 @end 20 @implementation ViewController 21 - (void)viewDidLoad { 22 [super viewDidLoad]; 23 24 image =[[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; 25 // 添加图片到视图 26 image.image = [UIImage imageNamed:@"素材07-6"]; 27 // 设置图片类型为合适 28 image.contentMode = UIViewContentModeScaleAspectFit; 29 // 添加视图上 30 [self.view addSubview:image]; 31 // 允许与用户交互 32 image.userInteractionEnabled = YES; 33 34 // 手势 继承UIGestureRecognizer 35 /* 36 UITapGestureRecognizer, // 点击 37 UIPinchGestureRecognizer, // 捏合 38 UIRotationGestureRecognizer, // 旋转 39 UISwipeGestureRecognizer, // 滑动,快速移动 40 UIPanGestureRecognizer, // 拖动,慢速移动 41 UILongPressGestureRecognizer // 长按 42 43 有些手势是关联的,例如:Tap与LongPress、Swipe与Pan、或是Tap一次与Tap两次 44 45 手势识别是具有互斥的原则的,比如单击和双击,如果他识别出一种手势,其后的手势将不被识别; 46 47 关联手势的处理:比如单击和双击,如果不做处理,它就只能发送单击的消息。为了能够识别出双击手势,就需要做一个特殊的处理逻辑,即先判断手势是否是双击,在双击失效的情况下作为单击手势处理。 48 [A requireGestureRecognizerToFail: B];函数,它可以指定当A手势发生时,即便A已经满足条件了,也不会立刻触发,会等到指定的手势B确定失败之后才触发。 49 */ 50 // 点击(单击) 51 UITapGestureRecognizer* oneTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(oneTap:)]; 52 // 单击,numberOfTapsRequired = 2 是双击 // 设置一个时间间隔 53 oneTap.numberOfTapsRequired = 1; // 设置点击次数 54 // 点击的手指数 默认为1 55 oneTap.numberOfTouchesRequired = 1; 56 // 默认为0 57 int a= oneTap.numberOfTouches; 58 NSLog(@"a = %d",a); 59 // 添加手势监测 60 [image addGestureRecognizer:oneTap]; 61 62 // 双击 63 UITapGestureRecognizer* twoTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(twoTap:)]; 64 twoTap.numberOfTapsRequired = 2; 65 [image addGestureRecognizer:twoTap]; 66 67 //(关键)、双击手势确定监测失败才会触发单击手势的响应操作(手势互斥时使用) 68 [oneTap requireGestureRecognizerToFail:twoTap]; // 手势的依赖性 69 70 71 // 捏合 72 UIPinchGestureRecognizer* pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)]; 73 [image addGestureRecognizer:pinch]; 74 75 // 旋转 76 UIRotationGestureRecognizer* rotation = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotation:)]; 77 [image addGestureRecognizer:rotation]; 78 79 // 滑动,快速移动 80 UISwipeGestureRecognizer* swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipe:)]; 81 // 设置滑动方向 默认时向右 82 swipe.direction = UISwipeGestureRecognizerDirectionRight; 83 typedef enum{ 84 UISwipeGestureRecognizerDirectionDown, // 85 UISwipeGestureRecognizerDirectionLeft, // 向左 86 UISwipeGestureRecognizerDirectionRight, // 向右 87 UISwipeGestureRecognizerDirectionUp, // 88 }UISwipeGestureRecognizerDirection; 89 90 [image addGestureRecognizer:swipe]; 91 92 // 拖动,慢速移动 93 UIPanGestureRecognizer* pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(pan:)]; 94 // 默认为-1;最大触摸点数 95 pan.maximumNumberOfTouches = 1; // 96 // 默认为1;最小触摸点数 97 pan.minimumNumberOfTouches = 2; // 这两个属性只有Pan有 98 99 [image addGestureRecognizer:pan]; 100 101 // 长按 102 UILongPressGestureRecognizer* zer = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(lon:)]; 103 // 设置长按时间 104 zer.minimumPressDuration = 0.5; // 2秒 105 [image addGestureRecognizer:zer]; 106 } 107 // 点击(单击) 108 - (void)oneTap:(UITapGestureRecognizer*)tap{ 109 // if (tap.numberOfTapsRequired == 1) { 110 // NSLog(@"单击"); 111 // }else if(tap.numberOfTapsRequired == 2){ 112 // NSLog(@"双击"); 113 // } 114 115 NSLog(@"单击"); 116 } 117 // 双击 118 - (void)twoTap:(UITapGestureRecognizer*)two{ 119 NSLog(@"双击"); 120 } 121 122 // 捏合 123 - (void)pinch:(UIPinchGestureRecognizer*)pinch{ 124 // 放大缩小 (形变属性) 125 pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale); 126 // 恢复标准 标准是1,大于1放大,小于1缩小 127 pinch.scale = 1; 128 // 清空形变属性 129 // pinch.view.transform = CGAffineTransformIdentity; 130 131 // 和上面等效 (但是这种方法缩放时没有滑动而是直接闪现缩放) 132 pinch.view.transform = CGAffineTransformScale(CGAffineTransformIdentity, pinch.scale, pinch.scale); 133 } 134 // 旋转 135 - (void)rotation:(UIRotationGestureRecognizer*)rotation{ 136 // 旋转(形变属性) // 和上面同理 137 rotation.view.transform = CGAffineTransformRotate(rotation.view.transform, rotation.rotation); 138 // 139 rotation.rotation = 0; 140 141 // rotation.view.transform = CGAffineTransformRotate(CGAffineTransformIdentity, rotation.rotation); 142 } 143 // 滑动,快速移动 144 - (void)swipe:(UISwipeGestureRecognizer*)swipe{ 145 NSLog(@"快速移动"); 146 } 147 // 拖动,慢速移动 148 - (void)pan:(UIPanGestureRecognizer*)pan{ 149 // 移动(形变属性) // 和上面同理 150 CGPoint translation = [pan translationInView:self.view]; 151 pan.view.center = CGPointMake(pan.view.center.x + translation.x, pan.view.center.y + translation.y); 152 [pan setTranslation:CGPointZero inView:self.view]; 153 } 154 // 长按 155 -(void)lon:(UILongPressGestureRecognizer*)longe{ 156 NSLog(@"长按"); 157 } 158 159 // 代理方法 160 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 161 return YES; 162 } 163 -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ 164 return YES; 165 } 166 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 167 return YES; 168 } 169 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{ 170 return YES; 171 } 172 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ 173 return YES; 174 }