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 }
原文地址:https://www.cnblogs.com/WillingToAsk1946zzh/p/4504473.html