[iOS UI进阶 - 3.2] 手势识别器UIGestureRecognizer

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形变进行缩放、旋转,所以再进行拖曳的时候是不能正常进行的。

时间: 2024-08-29 09:03:00

[iOS UI进阶 - 3.2] 手势识别器UIGestureRecognizer的相关文章

iOS UI进阶-6.0 手势

在开发过程中,经常会用到,需要关闭某个页面的手势返回功能. // 禁用返回手势 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // 禁用 返回手势 if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.inter

[iOS UI进阶 - 5.0] 手势解锁Demo

A.需求 1.九宫格手势解锁 2.使用了绘图和手势事件 code source: https://github.com/hellovoidworld/GestureUnlockDemo B.实现 使用按钮来处理每个圆点 使用代码生成按钮 取消按钮点击事件 设置普通状态和选中状态的背景图片 CGRectContainsPoint,移动到按钮范围内改变按钮为选中状态 按钮的连接:使用数组存储被选中的所有按钮,画上连线 已经连线的按钮不需要再连线 触摸结束清空连线和按钮选中状态 移动中也要画出线,最后

[iOS UI进阶 - 3.1] 触摸事件的传递

A.事件的产生和传递 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow) 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理touchesBegan-touchesMoved- touchedEnded-

[iOS UI进阶 - 0] Quiartz2D

A.简介 1. 需要掌握的 drawRect:方法的使用 常见图形的绘制:线条.多边形.圆 绘图状态的设置:文字颜色.线宽等 图形上下文状态的保存与恢复 图形上下文栈 1.基本图形绘制* 线段(线宽.线段样式)* 矩形(空心.实心.颜色)* 三角形.梯形等形状* 椭圆\圆* 圆弧* 文字绘制* 图片绘制(pattern)* 图形上下文栈 2.练习(画人) 3.模仿UIImageView 4.自定义checkbox 5.图片裁剪 6.图片水印 7.条纹背景 8.截图     2.概念 Quartz

[iOS UI进阶 - 3.0] 触摸事件的基本处理

A.需要掌握和练习的 1.介绍事件类型2.通过按钮的事件处理引出view的事件处理3.响应者对象 --> UIResponder --> UIView4.view的拖拽* 实现触摸方法,打印查看* 介绍touches和UIEvent参数* 扩展:点哪去哪5.涂鸦6.手势解锁7.事件的产生和传递8.响应者链条 9.手势 B.概念 1.iOS有3种主要事件 触摸事件 加速计事件 远程控制事件 2.响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事

iOS UI进阶-1.0 Quartz2D

概述 Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统.Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 代码实现 绘制线条 #import "LineView.h" @implementation LineView -(void)drawRect:(CGRect)rect { // Drawing code // 1.获得图形上下文 CGContextRef

iOS UI进阶05

Quartz2D Quartz2D是二维的绘图引擎 经包装的函数库,方便开发者使用.也就是说苹果帮我们封装了一套绘图的函数库 用Quartz2D写的同一份代码,既可以运行在iphone上又可以运行在mac上,可以跨平台开发. 开发中比较常用的是截屏/裁剪/自定义UI控件. Quartz2D在iOS开发中的价值就是自定义UI控件. 在drawRect:方法中才能获取到上下文 Quartz2D绘图 自定义view:需要绘图,就必须重写drawRect:方法 1 drawRect视图要显示的时候,才会

iOS UI进阶-4.0 地图与定位

在移动互联网时代,移动app能解决用户的很多生活琐事,比如 导航:去任意陌生的地方 周边:找餐馆.找酒店.找银行.找电影院 在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发 Map Kit :用于地图展示 Core Location :用于地理定位 2个热门专业术语 LBS :Location Based Service SoLoMo :Social Local Mobile(索罗门)

[iOS UI进阶 - 2.3] 彩票Demo v1.3

A.需求 真机调试 "关于”模块 存储开关状态 打电话.发短信 应用评分 打开其他应用 cell 在iOS6 和 iOS7的适配 block的循环引用 屏幕适配 code source:  code source: https://github.com/hellovoidworld/HelloLottery B.iOS真机测试小功能 (1)打电话 a.方法1 最简单最直接的方式:直接跳到拨号界面 1 NSURL *url = [NSURL URLWithString:@"tel://1