UIGestureRecognizer手势
来源:互联网 发布:sql偏移注入 编辑:程序博客网 时间:2024/04/30 00:13
UIGestureRecognizer手势
目录
1.什么是手势以及手势的种类
2.手势的添加及常用属性
3.多种手势并用
1.什么是手势以及手势的种类
UIKit中包含了UIGestureRecognizer类,用于检测发生在设备中的手势。UIGestureRecognizer基类是一个抽象类,定义了所有手势的基本行为,我们主要是使用它的子类,它有下面一些子类用于处理具体的手势:
1、UITapGestureRecognizer 轻击手势(点一下) 2、UIPinchGestureRecognizer 捏合手势(二指往內或往外拨动,用于缩放) 3、UIPanGestureRecognizer 拖动手势(摇动或者拖拽) 4、UISwipeGestureRecognizer 轻扫手势(擦碰) 5、UIRotationGestureRecognizer 旋转手势(旋转,手指朝相反方向移动) 6、UILongPressGestureRecognizer 长按手势(长按)
对于不同类型的手势识别器,具有不同的配置属性。比如UITapGestureRecognizer,可以配置拍击次数。界面接收到手势之后,可以发送一个消息,用于处理响应手势动作后的任务。当然,不同的手势识别器,发送的消息方法也会有所不同。
2.手势的添加及常用属性
添加手势时,一般是给某一个试图添加一个手势,例如给UIView,UIImageView添加手势,使之实现轻击、旋转、捏合、拖动、长按、滑动等事件。下面以给UIImageView添加手势为例说明6种手势的使用。
- 1.UITapGestureRecognizer 轻击手势
代码:
// 创建一个轻击手势对象,当轻击事件发生,就会调用self里的tap:这个方法 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)]; // 设置点击需要的手指头的个数! tap.numberOfTapsRequired = 2; //将手势添加到图片视图上 [_imageView addGestureRecognizer:tap];// 双击时执行的方法:双击放大- (void)tap:(UITapGestureRecognizer *)tap { [UIView animateWithDuration:0.5 animations:^{ _imageView.transform = CGAffineTransformScale(_imageView.transform, 1.1, 1.1); }];}
代码说明
(1) 创建轻击手势使用UITapGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法,当手势发生的时候,就会调用target对象的action方法。
(2) 手势的numberOfTouchesRequired属性意思是点击需要的手指头的个数,这个属性类型是NSUInteger,不设置的情况下默认是1,单击时就会触发事件,设置成2时,则点击两次才会触发target对象的action事件。
(3) 获取当前的图片视图_imageView,使用这个视图的addGestureRecognizer:添加手势tap,这样就可以在轻击的时候实现target对象的action方法了。
- 2.UIPinchGestureRecognizer 捏合手势
代码:
// 创建一个捏合手势 UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)]; pinch.delegate = self; [_imageView addGestureRecognizer:pinch];- (void)pinch:(UIPinchGestureRecognizer *)pinch { // pinch.scale 比例, pinch.velocity 强度 比例/s _imageView.transform = CGAffineTransformScale(_imageView.transform, pinch.scale, pinch.scale); // 重新设置比例为1. pinch.scale = 1;}
代码说明
(1) 创建捏合手势使用UIPinchGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法,当手势发生的时候,就会调用target对象的action方法。
(2) 同样使用视图的addGestureRecognizer:添加手势捏合,捏合手势多用于放大或缩小图片视图。
- 3.UIPanGestureRecognizer 拖动手势
代码:
// 创建一个拖动手势 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dealPan:)]; //将手势添加到图片视图上 [imageView addGestureRecognizer:pan];//消息方法dealPan:-(void)dealPan:(UIPanGestureRecognizer *)pan{ //获取拖移的位置 //屏幕上位置 CGPoint screenPoint = [pan locationInView:self.view]; imageView.center = screenPoint;}
代码说明
(1) 使用UIPanGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建拖动手势,当手势发生的时候,就会调用target对象的action方法。
(2) 同样使用视图的addGestureRecognizer:方法给图片视图添加拖动手势,当拖动视图时,就会调用-(void)dealPan:(UIPanGestureRecognizer *)pan这个方法,手势的locationInView:方法会获取手势在视图上移动的点,再将这个点设置为图片视图的中心点,图片视图就会随着手指移动的方向而移动。
- 4.UISwipeGestureRecognizer 轻扫手势
代码:
// 创建一个轻扫手势,当发生时,就调用self的swipe:方法 UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)]; // 设置轻扫的方向, 枚举 (上下左右) ,注意,这个枚举值不要或在一起用 swipe.direction = UISwipeGestureRecognizerDirectionRight; [_imageView addGestureRecognizer:swipe]; //消息方法// 往右扫透明度降低- (void)swipe:(UISwipeGestureRecognizer *)swipe { if (_imageView.alpha > 0.1) { _imageView.alpha -= 0.1; }}
代码说明
(1) 使用UISwipeGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建清扫手势,当手势发生的时候,就会调用target对象的action方法。
(2) 设置清扫手势的direction属性,意思是清扫的方向,这个属性类型是UISwipeGestureRecognizerDirection,是一个枚举,值都有UISwipeGestureRecognizerDirectionRight,UISwipeGestureRecognizerDirectionLeft,
UISwipeGestureRecognizerDirectionUp,
UISwipeGestureRecognizerDirectionDown,
分别设置不同清扫方向下的action方法。(3) 同样使用视图的addGestureRecognizer:方法给图片视图添加清扫手势,当按照一定的方向清扫图片视图时,就会调用- (void)swipe:(UISwipeGestureRecognizer *)swipe这个方法,每清扫一次图片视图的透明度就会降低0.1。
- 5.UIRotationGestureRecognizer 旋转手势
代码:
// 创建一个旋转手势,当发生时,就调用self的rotation:方法 UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)]; // 将旋转手势的代理,设置为rootViewController rotation.delegate = self; //添加手势 [_imageView addGestureRecognizer:rotation];//消息方法rotation:- (void)rotation:(UIRotationGestureRecognizer *)rotation { // NSLog(@"%.2f", rotation.rotation); // 旋转弧度,在已经旋转的基础上,继续旋转。 // rotation.velocity 旋转的强度 rotation/s _imageView.transform = CGAffineTransformRotate(_imageView.transform, rotation.rotation); // 将旋转之后的角度清0! rotation.rotation = 0;}
代码说明
(1) 使用UIRotationGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建旋转手势。
(2) 同样使用视图的addGestureRecognizer:方法给图片视图添加旋转手势,当用手指旋转视图时,就会调用- (void)rotation:(UIRotationGestureRecognizer *)rotation这个方法,从而使图片发生旋转。
- 6.UILongPressGestureRecognizer 长按手势
代码:
// 创建一个长按手势 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)]; // 最小的持续时间 longPress.minimumPressDuration = 2.0; // 允许移动的最大范围 longPress.allowableMovement = 5.0; // 图片视图上添加手势 [_imageView addGestureRecognizer:longPress]; // 长按手势,会触发两次,一次是手势发生了,一次是抬起- (void)longPress:(UILongPressGestureRecognizer *)longPress { // 判断状态,只在手势发生的时候执行if里的语句 if (longPress.state == UIGestureRecognizerStateBegan) { UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"哎呦" message:@"哎呦" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil]; [av show]; }}
代码说明
(1) 使用UILongPressGestureRecognizer的alloc + initWithTarget:(id) action:(SEL)方法创建长按手势。
(2) 长按手势的minimumPressDuration属性意思是最小的持续时间,只有长按的时间大于这个最小持续时间才会判定手势为长按手势,这个属性类型是CFTimeInterval,需要传入一个时间间隔,不设置的情况下默认是0.5,即长按时间只要超过0.5秒就会触发action方法。
(3) 长按手势的allowableMovement属性意思是允许移动的最大范围,这个属性类型是CGFloat,需要传入一个CGFloat对象,不设置的情况下默认是10,即长按手势移动的距离超过10,action方法就不会被触发。
(4) 同样使用视图的addGestureRecognizer:方法给图片视图添加长按手势,当长按视图时,就会调用- (void)longPress:(UILongPressGestureRecognizer *)longPress这个方法,弹出一个警告框UIAlertView。但是这个方法会被调用两次,一次是手势发生的时候,一次是手抬起的时候。可以利用长按手势的state属性来判断手势的状态是否是UIGestureRecognizerStateBegan,即手势开始发生的时候,从而使长按手势事件只会被调用一次。
3.多种手势并用
// 创建一个轻击手势对象,当轻击事件发生,就会调用self里的tap:这个方法 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)]; // 设置点击需要的手指头的个数! tap.numberOfTapsRequired = 2; //将手势添加到图片视图上 [_imageView addGestureRecognizer:tap]; // 对于视图控件,可以添加多个手势 (也不宜太多) UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; [_imageView addGestureRecognizer:singleTap]; // singleTap 这个手势响应,要在tap手势响应失败后,才触发。 [singleTap requireGestureRecognizerToFail:tap];// 双击时执行的方法:双击放大- (void)tap:(UITapGestureRecognizer *)tap { [UIView animateWithDuration:0.5 animations:^{ _imageView.transform = CGAffineTransformScale(_imageView.transform, 1.1, 1.1); }];}// 单击时执行的方法:单击缩小- (void)singleTap:(UITapGestureRecognizer *)tap { [UIView animateWithDuration:0.5 animations:^{ _imageView.transform = CGAffineTransformScale(_imageView.transform, 0.9, 0.9); }];}
- 手势UIGestureRecognizer
- 手势UIGestureRecognizer
- UIGestureRecognizer手势
- UIGestureRecognizer 手势
- 手势UIGestureRecognizer
- 手势UIGestureRecognizer
- UIGestureRecognizer手势
- UIGestureRecognizer手势
- UIGestureRecognizer手势
- UIGestureRecognizer手势
- UIGestureRecognizer手势
- 使用iOS手势UIGestureRecognizer
- 使用iOS手势UIGestureRecognizer
- 使用iOS手势UIGestureRecognizer
- 使用iOS手势UIGestureRecognizer
- iOS手势UIGestureRecognizer
- 使用iOS手势UIGestureRecognizer
- 使用iOS手势UIGestureRecognizer
- zjnu 1450 - 迷宫(BFS)解题报告
- Leetcode.Bit Manipulation.位运算专题.(持续更新)
- 自定义Drawable(文字按钮点击效果设置)
- COW
- Eclipse 关联源码
- UIGestureRecognizer手势
- 使用栈的递归与非递归DFS
- PHP源码中unserialize函数引发的漏洞分析
- 信息学奥林匹克竞赛-小鱼的数字游戏
- 常用电压基准芯片
- ubuntu中&&(命令执行控制)
- Lua和C++交互总结(很详细)
- 破解由于异步执行而导致的JS插件未加载就使用的问题
- 自适应滤波中期望信号的相关知识