iOS开发 - 手势识别(UIGestureRecognizer) --转载

UIGestureRecognizer

为了完成手势识别,必须借助于手势识别器—-UIGestureRecognizer

利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势

UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势

?
1
2
3
4
5
6
7
<code class = "hljs cs" >UITapGestureRecognizer       //(敲击)
UIPinchGestureRecognizer     //(捏合,用于缩放)
UIPanGestureRecognizer       //(拖拽)
UISwipeGestureRecognizer     //(轻扫)
UIRotationGestureRecognizer  //(旋转)
UILongPressGestureRecognizer //(长按)
</code>

敲击 UITapGestureRecognizer

每一个手势识别器的用法都差不多,比如UITapGestureRecognizer的使用步骤如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<code class = "hljs objectivec" >
创建手势识别器对象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
 
设置手势识别器对象的具体属性
// 连续敲击2次
tap.numberOfTapsRequired = 2 ;
// 需要2根手指一起敲击
tap.numberOfTouchesRequired = 2 ;
 
添加手势识别器到对应的view上
[self.iconView addGestureRecognizer:tap];
 
监听手势的触发
[tap addTarget:self action: @selector (tapIconView:)];
</code>

敲击实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<code class = "hljs objectivec" > @interface GRViewController () <uigesturerecognizerdelegate>
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
 
@end
 
@implementation GRViewController
 
- ( void )viewDidLoad
{
     [ super viewDidLoad];
 
     [self testTap2];
}
 
- ( void )testTap2
{
     UIGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action: @selector (tapView)];
     tap.delegate = self;
     [self.iconView addGestureRecognizer:tap];
}
 
#pragma mark - 代理方法
/**
  *  当点击view的时候,会先调用这个方法
  */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
     CGPoint pos = [touch locationInView:touch.view];
     if (pos.x <= self.iconView.frame.size.width * 0.5 ) {
         return YES;
     }
     return NO;
}
 
- ( void )testTap
{
     // 1.创建手势识别器对象
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
     // 连续敲击2次,手势才能识别成功
     tap.numberOfTapsRequired = 2 ;
     tap.numberOfTouchesRequired = 2 ;
 
     // 2.添加手势识别器对象到对应的view
     [self.iconView addGestureRecognizer:tap];
 
     // 3.添加监听方法(识别到了对应的手势,就会调用监听方法)
     [tap addTarget:self action: @selector (tapView)];
}
 
- ( void )tapView
{
     NSLog(@ "-----我敲击了屏幕!!" );
}
 
@end </uigesturerecognizerdelegate></code>

长按和轻扫实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<code class = "hljs objectivec" > @interface GRViewController ()
@property (weak, nonatomic) IBOutlet UIView *redView;
 
@end
 
@implementation GRViewController
 
- ( void )viewDidLoad
{
     [ super viewDidLoad];
 
     UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action: @selector (swipeView)];
 
     swipe.direction = UISwipeGestureRecognizerDirectionUp;
 
     [self.redView addGestureRecognizer:swipe];
}
 
- ( void )swipeView
{
     NSLog(@ "swipeView" );
}
 
- ( void )testLongPress
{
     UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] init];
     [longPress addTarget:self action: @selector (longPressView)];
 
     // 至少长按2秒
     longPress.minimumPressDuration = 2 ;
 
     // 在触发手势之前,50px范围内长按有效
     longPress.allowableMovement = 50 ;
 
     [self.redView addGestureRecognizer:longPress];
}
 
- ( void )longPressView
{
     NSLog(@ "长按了红色的view" );
}
 
@end </code>

缩放和旋转实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
<code class = "hljs objectivec" > @interface GRViewController () <uigesturerecognizerdelegate>
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@end
 
@implementation GRViewController
 
- ( void )viewDidLoad
{
     [ super viewDidLoad];
 
     [self testPinchAndRotate];
}
 
#pragma mark - 手势识别器的代理方法
 
/**
  *  是否允许多个手势识别器同时有效
  *  Simultaneously : 同时地
  */
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
     return YES;
}
 
#pragma mark - 缩放 + 旋转
- ( void )testPinchAndRotate
{
     [self testPinch];
     [self testRotate];
}
 
#pragma mark - 缩放手势(捏合手势)
- ( void )testPinch
{
     UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action: @selector (pinchView:)];
     pinch.delegate = self;
     [self.iconView addGestureRecognizer:pinch];
}
 
- ( void )pinchView:(UIPinchGestureRecognizer *)pinch
{
     pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale);
     pinch.scale = 1 ; // 这个真的很重要!!!!!
}
 
#pragma mark - 旋转手势
- ( void )testRotate
{
     UIRotationGestureRecognizer *recognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action: @selector (rotateView:)];
     recognizer.delegate = self;
     [self.iconView addGestureRecognizer:recognizer];
}
 
- ( void )rotateView:(UIRotationGestureRecognizer *)recognizer
{
     recognizer.view.transform = CGAffineTransformRotate(recognizer.view.transform, recognizer.rotation);
     recognizer.rotation = 0 ; // 这个很重要!!!!!
}
 
@end </uigesturerecognizerdelegate></code>

拖拽实例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<code class = "hljs objectivec" > @interface GRViewController ()
@property (weak, nonatomic) IBOutlet UIView *purpleView;
 
@end
 
@implementation GRViewController
 
- ( void )viewDidLoad
{
     [ super viewDidLoad];
 
     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action: @selector (panView:)];
     [self.purpleView addGestureRecognizer:pan];
}
 
- ( void )panView:(UIPanGestureRecognizer *)pan
{
 
     switch (pan.state) {
         case UIGestureRecognizerStateBegan: // 开始触发手势
 
             break ;
 
         case UIGestureRecognizerStateEnded: // 手势结束
 
             break ;
 
         default :
             break ;
     }
 
     // 1.在view上面挪动的距离
     CGPoint translation = [pan translationInView:pan.view];
     CGPoint center = pan.view.center;
     center.x += translation.x;
     center.y += translation.y;
     pan.view.center = center;
 
     // 2.清空移动的距离
     [pan setTranslation:CGPointZero inView:pan.view];
}
 
@end </code>

手势识别的状态

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<code class = "hljs objectivec" >typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
     // 没有触摸事件发生,所有手势识别的默认状态
     UIGestureRecognizerStatePossible,
     // 一个手势已经开始但尚未改变或者完成时
     UIGestureRecognizerStateBegan,
     // 手势状态改变
     UIGestureRecognizerStateChanged,
     // 手势完成
     UIGestureRecognizerStateEnded,
     // 手势取消,恢复至Possible状态
     UIGestureRecognizerStateCancelled,
     // 手势失败,恢复至Possible状态
     UIGestureRecognizerStateFailed,
     // 识别到手势识别
     UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
};
</code>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值