1 /**
2 一. 手势说明
3
4 0> UIGestureRecognizer 所有手势识别的父类,不允许直接使用
5
6 最常用的属性:
7 view: 发生手势的视图
8 state: 手势当前的状态,主要用于连续手势,对于离散手势一般不使用
9
10 1> UITapGestureRecognizer 点按手势(离散手势,其他手势都是连续手势)
11
12 属性:
13 numberOfTapsRequired 点击次数,单击双击
14 numberOfTouchesRequired 手指根数
15
16 2> UILongPressGestureRecognizer 长按手势
17
18 3> UIPanGestureRecognizer 拖动手势
19
20 方法:
21 // 在视图中拖动的距
22 - (CGPoint)translationInView:(UIView *)view;
23 // 在视图中拖动的速度
24 - (CGPoint)velocityInView:(UIView *)view;
25
26 4> UIPinchGestureRecognizer 捏合手势
27
28 属性:
29 scale 比例
30
31 5> UIRotationGestureRecognizer 旋转手势
32
33 属性
34 rotation 旋转角度
35
36 6> UISwipeGestureRecognizer 轻扫手势,通常添加到根视图上
37
38 属性
39 numberOfTouchesRequired 参与轻扫手势的手指根数
40 direction 轻扫的方向
41
42 提示:
43 1) 如果要检测几个方向的轻扫,需要分别实例化几个轻扫手势
44 2) 轻扫手势虽然是连续手势,但是不需要去处理UIGestureRecognizerStateChanged状态(因为是在手指离开屏幕后,该手势才被识别)
45 46 */
47
48 - (void)viewDidLoad
49 {
50 [super viewDidLoad];
51
52 // 0. 实例化UIImageView
53 UIImage *image = [UIImage imageNamed:@"001"];
54 UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
55 [imageView setFrame:kImageFrame];
56 [self.view addSubview:imageView];
57 [imageView setUserInteractionEnabled:YES];
58 self.imageView = imageView;
59
60 // 1. 添加点按手势
61 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
62 // 定义双击
63 tap.numberOfTapsRequired = 2;
64 [imageView addGestureRecognizer:tap];
65
66 // 2. 添加长按手势
67 UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longTap:)];
68 [imageView addGestureRecognizer:longTap];
69
70 // 3. 拖动手势
71 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
72
73 [imageView addGestureRecognizer:pan];
74
75 // 4. 捏合手势
76 UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
77 [imageView addGestureRecognizer:pinch];
78
79 // 5. 旋转手势
80 UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
81 [imageView addGestureRecognizer:rotation];
82
83 // 6. 轻扫手势
84 // 如果要做清扫手势,需要分别实例化4个方向的手势
85 UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
86
87 swipeUp.direction = UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
88
89 [self.view addGestureRecognizer:swipeUp];
90 }
91
92 #pragma mark - 点按手势
93 - (void)tap:(UITapGestureRecognizer *)recognizer
94 {
95 // 双击放大图片
96 UIImageView *imageView = (UIImageView *)recognizer.view;
97
98 [UIView animateWithDuration:0.8f animations:^{
99 [imageView setTransform:CGAffineTransformScale(imageView.transform, 2.0, 2.0)];
100 } completion:^(BOOL finished) {
101 [UIView animateWithDuration:0.5f animations:^{
102 [imageView setTransform:CGAffineTransformScale(imageView.transform, 0.5, 0.5)];
103 }];
104 }];
105 }
106
107 #pragma mark - 长按手势
108 - (void)longTap:(UILongPressGestureRecognizer *)recognizer
109 {
110 NSLog(@"长按");
111 // 长按旋转图片
112 // 开始长按
113 // 在形变时,iOS采取就近原则旋转,如果不能按照希望的方向旋转,可以增加一些修正值,例如0.01
114 // 直接通过形变属性,要实现一次性转一圈,比较困难,可以分两次进行
115 if (UIGestureRecognizerStateBegan == recognizer.state) {
116 [UIView animateWithDuration:0.8f animations:^{
117 [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, M_PI - 0.01)];
118 }];
119 } else if (UIGestureRecognizerStateEnded == recognizer.state) {
120 [UIView animateWithDuration:0.8f animations:^{
121 [recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, M_PI - 0.01)];
122 } completion:^(BOOL finished) {
123 // 清除所有的形变属性
124 [recognizer.view setTransform:CGAffineTransformIdentity];
125 }];
126 }
127 }
128
129 #pragma mark - 拖动手势
130 - (void)pan:(UIPanGestureRecognizer *)recognizer
131 {
132 CGPoint translation = [recognizer translationInView:self.view];
133
134 // 让图像根据手指移动
135 if (UIGestureRecognizerStateChanged == recognizer.state) {
136 // 形变参数,有Make的时候,是相对初始位置计算的
137 // 没有Make是递增修改形变的
138 [recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
139
140 // 拖动手指中的平移距离是相对于初始位置,如果使用CGAffineTransformTranslate累加形变方法
141 // 需要在每次位移之后,重置recognizer的位移量,就是将位移量清零
142 [recognizer setTranslation:CGPointZero inView:recognizer.view];
143 }
144 }
145
146 #pragma mark - 捏合手势
147 - (void)pinch:(UIPinchGestureRecognizer *)recognizer
148 {
149 // 调整图像的显示比例
150 if (UIGestureRecognizerStateChanged == recognizer.state) {
151
152 // 等比例缩放
153 [recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale)];
154
155 // 在设置累加形变参数时,需要充值手势的缩放比例
156 recognizer.scale = 1.0f;
157 }
158 }
159
160 #pragma mark - 旋转手势
161 - (void)rotate:(UIRotationGestureRecognizer *)recognizer
162 {
163 if (UIGestureRecognizerStateChanged == recognizer.state) {
164 recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
165
166 // 重置旋转量
167 recognizer.rotation = 0.0f;
168 }
169 }
170
171 #pragma mark - 轻扫手势
172 - (void)swipe:(UISwipeGestureRecognizer *)recognizer
173 {
174 NSLog(@"%d", recognizer.direction);
175 if (UISwipeGestureRecognizerDirectionDown == recognizer.direction) {
176 NSLog(@"向下");
177 } else if (UISwipeGestureRecognizerDirectionUp == recognizer.direction) {
178 NSLog(@"向上");
179 } else if (UISwipeGestureRecognizerDirectionLeft == recognizer.direction) {
180 NSLog(@"向左");
181 } else if (UISwipeGestureRecognizerDirectionRight == recognizer.direction) {
182 NSLog(@"向右");
183 }
184 }