手势识别器UIGestureRecognizer

旧监听触摸事件做法

如果想监听一个view上面的触摸事件,之前的做法是

  1. 自定义一个view
  2. 实现view的touches方法,在方法内部实现具体处理代码

通过touches方法监听view触摸事件,有很明显的几个缺点

  • 必须得自定义view
  • 由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件
  • 不容易区分用户的具体手势行为

UIGestureRecognizer

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

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

  • UITapGestureRecognizer(敲击)
  • UIPinchGestureRecognizer(捏合,用于缩放)
  • UIPanGestureRecognizer(拖拽)
  • UISwipeGestureRecognizer(轻扫)
  • UIRotationGestureRecognizer(旋转)
  • UILongPressGestureRecognizer(长按)

手势识别的状态:

typedef NS_ENUM(NSInteger, UIGestureRecognizerState) {
    // 没有触摸事件发生,所有手势识别的默认状态
    UIGestureRecognizerStatePossible,
    // 一个手势已经开始但尚未改变或者完成时
    UIGestureRecognizerStateBegan,
    // 手势状态改变
    UIGestureRecognizerStateChanged,
    // 手势完成
    UIGestureRecognizerStateEnded,
    // 手势取消,恢复至Possible状态
    UIGestureRecognizerStateCancelled, 
    // 手势失败,恢复至Possible状态
    UIGestureRecognizerStateFailed,
    // 识别到手势识别
    UIGestureRecognizerStateRecognized = UIGestureRecognizerStateEnded
};

UITapGestureRecognizer[可以设置图片的点击]

点击触发的状态只有:UIGestureRecognizerStateEnded。
每一个手势识别器的用法都差不多,比如UITapGestureRecognizer的使用步骤如下:
1、创建手势识别器对象

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];

2、设置手势识别器对象的具体属性

// 连续敲击2次
tap.numberOfTapsRequired = 2;
// 需要2根手指一起敲击
tap.numberOfTouchesRequired = 2;

3、添加手势识别器到对应的view上

[self.iconView addGestureRecognizer:tap];

4、监听手势的触发

[tap addTarget:self action:@selector(tapIconView:)];

也可以一步完成:

    [self.iconView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapView)]];

UILongPressGestureRecognizer

// 手指按下后,事件响应之前允许手指移动的偏移量[大于这个偏移量就不响应]
@property (nonatomic) CGFloat allowableMovement; 
// 设置按住触发的最小时间
@property (nonatomic) CFTimeInterval minimumPressDuration; 

UISwipeGestureRecognizer

// 轻扫方向
@property(nonatomic) UISwipeGestureRecognizerDirection direction; 

如果要设置多个轻扫方向,则好针对一个对象定义多个手势识别器,每个手势识别器设置一个方向。
如果对一个手势识别器使用多个”|”,即:

UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp | UISwipeGestureRecognizerDirectionDown

则有可能出现在某个方向上无效的情况。

UIRotationGestureRecognizer

// 旋转角度
@property (nonatomic)          CGFloat rotation;
// 旋转速率
@property (nonatomic,readonly) CGFloat velocity;

点击view,view同时旋转:

// 在传入的transform基础上递增一个弧度
    self.iconView.transform = CGAffineTransformRotate(self.iconView.transform, gesture.rotation);
// 将旋转的弧度清零(注意不是将图片旋转的弧度清零, 而是将当前手指旋转的所在弧度置为零;这样,下次返回的rotation就为增加的弧度,而不是从0开始计算的弧度)
    gesture.rotation = 0;

UIPinchGestureRecognizer

// 缩放比例
@property (nonatomic)          CGFloat scale;
// 捏合速度
@property (nonatomic,readonly) CGFloat velocity;
self.iconView.transform = CGAffineTransformScale(self.iconView.transform, pinch.scale, pinch.scale);
// 这里同上面差不多,也是改变了每次的参照比例[参照比例一直是1.0,而不是1.0*0.9*0.8....]   
pinch.scale = 1.0;

UIPanGestureRecognizer

// 返回当前点击点在view的坐标
// 返回的值是以手指按下的点为原点
- (CGPoint)translationInView:(UIView *)view;     
// 设置移动 
- (void)setTranslation:(CGPoint)translation inView:(UIView *)view;
CGPoint point = [pan translationInView:pan.view];

CGPoint temp = self.customView.center;
temp.x += point.x;
temp.y += point.y;
self.customView.center = temp;
// 把移动的过程中获取的点当作原点
// 如X0-1-2-3,如果没有加这一句,则x=1+2+3=6
// 实际上只有3,所以要重置原点,使x=1+1+1    
[pan setTranslation:CGPointZero inView:pan.view];

UIGestureRecognizer代理

// 该方法返回的BOOL值决定了view是否能够同时响应多个手势
// 可以在该方法判断指定的多个手势出现时返回YES
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; 

你可能感兴趣的:(手势识别器UIGestureRecognizer)