UIGestureRecognizer 手势检测

前言

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    NS_CLASS_AVAILABLE_IOS(3_2) @interface UIGestureRecognizer : NSObject

    // 点击(轻点)
    NS_CLASS_AVAILABLE_IOS(3_2) @interface UITapGestureRecognizer : UIGestureRecognizer

    // 长按(按住不放)
    NS_CLASS_AVAILABLE_IOS(3_2) @interface UILongPressGestureRecognizer : UIGestureRecognizer

    // 旋转(两个手指进行旋转)
    NS_CLASS_AVAILABLE_IOS(3_2) @interface UIRotationGestureRecognizer : UIGestureRecognizer

    // 捏合(两个手指,缩放手势)
    NS_CLASS_AVAILABLE_IOS(3_2) @interface UIPinchGestureRecognizer : UIGestureRecognizer

    // 拖动(移动速度较慢)
    NS_CLASS_AVAILABLE_IOS(3_2) @interface UIPanGestureRecognizer : UIGestureRecognizer

    // 滑动(快速移动)
    NS_CLASS_AVAILABLE_IOS(3_2) @interface UISwipeGestureRecognizer : UIGestureRecognizer
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    @available(iOS 3.2, *) public class UIGestureRecognizer : NSObject

    // 点击(轻点)
    @available(iOS 3.2, *) public class UITapGestureRecognizer : UIGestureRecognizer

    // 长按(按住不放)
    @available(iOS 3.2, *) public class UILongPressGestureRecognizer : UIGestureRecognizer

    // 旋转(两个手指进行旋转)
    @available(iOS 3.2, *) public class UIRotationGestureRecognizer : UIGestureRecognizer

    // 捏合(两个手指,缩放手势)
    @available(iOS 3.2, *) public class UIPinchGestureRecognizer : UIGestureRecognizer

    // 拖动(移动速度较慢)
    @available(iOS 3.2, *) public class UIPanGestureRecognizer : UIGestureRecognizer

    // 滑动(快速移动)
    @available(iOS 3.2, *) public class UISwipeGestureRecognizer : UIGestureRecognizer

1、tapGesture 点击手势

1.1 tapGesture 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    // 实例化点击手势对象
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self
    action:@selector(tapClick:)];

    // 向 imageView 添加点击手势
    [imageView addGestureRecognizer:tapGesture];
  • Swift

    1
    2
    3
    4
    5
    6
    // 实例化点击手势对象
    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self,
    action: #selector(UiGestureRecognizer.tapClick(_:)))

    // 向 imageView 添加点击手势
    imageView?.addGestureRecognizer(tapGesture)

1.2 tapGesture 的设置

  • Objective-C

    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
    // 设置点击次数
    /*
    默认为 1:单击,为 2 时为双击
    */
    singleTapGesture.numberOfTapsRequired = 1;

    // 设置触摸点数
    /*
    默认为 1,单个手指触摸
    */
    singleTapGesture.numberOfTouchesRequired = 1;

    // 单双击共存
    /*
    设置单击手势与双击手势共存,当没有检测到双击手势或检测双击手势失败时单击手势才有效
    */
    [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];

    // 获取点击的视图
    /*
    剪取点击的视图,附带点击手势一起剪取
    */
    UIView *tapView = tapGesture.view;

    // 获取点击的图片
    /*
    复制点击的图片,附带点击手势一起复制
    */
    UIImage *tapImage = ((UIImageView *)tapGesture.view).image;
  • Swift

    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
    // 设置点击次数
    /*
    默认为 1:单击,为 2 时为双击
    */
    singleTapGesture.numberOfTapsRequired = 1

    // 设置触摸点数
    /*
    默认为 1,单个手指触摸
    */
    singleTapGesture.numberOfTouchesRequired = 1

    // 单双击共存
    /*
    设置单击手势与双击手势共存,当没有检测到双击手势或检测双击手势失败时单击手势才有效
    */
    singleTapGesture.requireGestureRecognizerToFail(doubleTapGesture)

    // 获取点击的视图
    /*
    剪取点击的视图,附带点击手势一起剪取
    */
    let tapView: UIView = tapGesture.view!

    // 获取点击的图片
    /*
    复制点击的图片,附带点击手势一起复制
    */
    let tapImage: UIImage = (tapGesture.view! as! UIImageView).image!

1.3 自定义触摸响应事件处理

  • Objective-C

    1
    2
    3
    - (void)tapClick:(UITapGestureRecognizer *)tapGesture {

    }
  • Swift

    1
    2
    3
    func tapClick(tapGesture:UITapGestureRecognizer) {

    }

2、longPressGesture 长按手势

2.1 longPressGesture 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    // 实例化长按手势对象
    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self
    action:@selector(longPressClick:)];

    // 向 imageView 添加长按手势
    [imageView addGestureRecognizer:longPressGesture];
  • Swift

    1
    2
    3
    4
    5
    6
    // 实例化长按手势对象
    let longPressGesture: UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: self,
    action: #selector(UiGestureRecognizer.longPressClick(_:)))

    // 向 imageView 添加长按手势
    imageView?.addGestureRecognizer(longPressGesture)

2.2 longPressGesture 的设置

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 获取手势状态
    UIGestureRecognizerState state = longPressGesture.state;

    // 长按手势开始
    if (longPressGesture.state == UIGestureRecognizerStateBegan) {

    }

    // 长按手势触发结束
    if (longPressGesture.state == UIGestureRecognizerStateEnded) {

    }
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // 获取手势状态
    let state:UIGestureRecognizerState = longPressGesture.state

    // 长按手势开始
    if longPressGesture.state == UIGestureRecognizerState.Began {

    }

    // 长按手势触发结束
    if longPressGesture.state == UIGestureRecognizerState.Ended {

    }

2.3 自定义触摸响应事件处理

  • Objective-C

    1
    2
    3
    - (void)longPressClick:(UILongPressGestureRecognizer *)longPressGesture {

    }
  • Swift

    1
    2
    3
    func longPressClick(longPressGesture:UILongPressGestureRecognizer) {

    }

3、rotationGesture 旋转手势

3.1 rotationGesture 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    // 实例化旋转手势对象
    UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self
    action:@selector(rotationClick:)];

    // 向 imageView 添加旋转手势
    [imageView addGestureRecognizer:rotationGesture];
  • Swift

    1
    2
    3
    4
    5
    6
    // 实例化旋转手势对象
    let rotationGesture: UIRotationGestureRecognizer = UIRotationGestureRecognizer(target: self,
    action: #selector(UiGestureRecognizer.rotationClick(_:)))

    // 向 imageView 添加旋转手势
    imageView?.addGestureRecognizer(rotationGesture)

3.2 rotationGesture 的设置

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 获取旋转角度
    /*
    rotation 获取到的为弧度,1 度 = PI/180 弧度
    */
    CGFloat rotation = rotationGesture.rotation * 180 * M_1_PI;

    // 图片旋转
    /*
    lastRotation 为之前的角度
    */
    imageView.transform = CGAffineTransformMakeRotation(lastRotation + rotationGesture.rotation);

    // 旋转手势触发结束
    if (rotationGesture.state == UIGestureRecognizerStateEnded) {

    lastRotation += rotationGesture.rotation;
    }
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    // 获取旋转角度
    /*
    rotation 获取到的为弧度,1 度 = PI/180 弧度
    */
    let rotation: CGFloat = rotationGesture.rotation * 180 * CGFloat(M_1_PI)

    // 图片旋转
    /*
    lastRotation 为之前的角度
    */
    imageView?.transform = CGAffineTransformMakeRotation(lastRotation + rotationGesture.rotation)

    // 旋转手势触发结束
    if rotationGesture.state == UIGestureRecognizerState.Ended {

    lastRotation += rotationGesture.rotation
    }

3.3 自定义触摸响应事件处理

  • Objective-C

    1
    2
    3
    4
    // 用模拟器时需按住 option 键
    - (void)rotationClick:(UIRotationGestureRecognizer *)rotationGesture {

    }
  • Swift

    1
    2
    3
    4
    // 用模拟器时需按住 option 键
    func rotationClick(rotationGesture:UIRotationGestureRecognizer) {

    }

4、pinchGesture 捏合手势

4.1 pinchGesture 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    // 实例化捏合手势对象
    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self
    action:@selector(pinchClick:)];

    // 向 imageView 添加捏合手势
    [imageView addGestureRecognizer:pinchGesture];
  • Swift

    1
    2
    3
    4
    5
    6
    // 实例化捏合手势对象
    let pinchGesture:UIPinchGestureRecognizer = UIPinchGestureRecognizer(target: self,
    action: #selector(UiGestureRecognizer.pinchClick(_:)))

    // 向 imageView 添加捏合手势
    imageView?.addGestureRecognizer(pinchGesture)

4.2 pinchGesture 的设置

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 获取缩放倍数
    CGFloat scale = pinchGesture.scale;

    // 图片缩放
    imageView.transform = CGAffineTransformMakeScale(pinchGesture.scale, pinchGesture.scale);
    imageView.bounds = CGRectMake(0, 0, imageView.bounds.size.width * pinchGesture.scale,
    imageView.bounds.size.height * pinchGesture.scale);

    // 还原缩放倍数
    [pinchGesture setScale:1];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 获取缩放倍数
    let scale: CGFloat = pinchGesture.scale

    // 图片缩放
    imageView?.transform = CGAffineTransformMakeScale(pinchGesture.scale, pinchGesture.scale)
    imageView?.bounds = CGRectMake(0, 0, imageView!.bounds.size.width * pinchGesture.scale,
    imageView!.bounds.size.height * pinchGesture.scale)

    // 还原缩放倍数
    pinchGesture.scale = 1

4.3 自定义触摸响应事件处理

  • Objective-C

    1
    2
    3
    4
    // 用模拟器时需按住 option 键
    - (void)pinchClick:(UIPinchGestureRecognizer *)pinchGesture {

    }
  • Swift

    1
    2
    3
    4
    // 用模拟器时需按住 option 键
    func pinchClick(pinchGesture:UIPinchGestureRecognizer) {

    }

5、panGesture 拖动手势

5.1 panGesture 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    // 实例化拖拽手势对象
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self
    action:@selector(panClick:)];

    // 向 imageView 添加拖拽手势
    [imageView addGestureRecognizer:panGesture];
  • Swift

    1
    2
    3
    4
    5
    6
    // 实例化拖拽手势对象
    let panGesture: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self,
    action: #selector(UiGestureRecognizer.panClick(_:)))

    // 向 imageView 添加拖拽手势
    imageView?.addGestureRecognizer(panGesture)

5.2 panGesture 的设置

  • Objective-C

    1
    2
    3
    4
    5
    // 获取手势位置
    CGPoint currentPoint = [panGesture locationInView:self.view];

    // 图片移动
    imageView.center = currentPoint;
  • Swift

    1
    2
    3
    4
    5
    // 获取手势位置
    let currentPoint: CGPoint = panGesture.locationInView(self.view)

    // 图片移动
    imageView?.center = currentPoint

5.3 自定义触摸响应事件处理

  • Objective-C

    1
    2
    3
    - (void)panClick:(UIPanGestureRecognizer *)panGesture {

    }
  • Swift

    1
    2
    3
    func panClick(panGesture:UIPanGestureRecognizer) {

    }

6、swipeGesture 滑动手势

6.1 swipeGesture 的创建

  • Objective-C

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 实例化滑动手势对象
    UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self
    action:@selector(swipeClick:)];

    // 设置滑动方向,默认为 0:向右滑动
    swipeGesture.direction = UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;

    // 向 imageView 添加拖拽手势
    [imageView addGestureRecognizer:swipeGesture];
  • Swift

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 实例化滑动手势对象
    let swipeGesture: UISwipeGestureRecognizer = UISwipeGestureRecognizer(target: self,
    action: #selector(UiGestureRecognizer.swipeClick(_:)))

    // 设置滑动方向,默认为 0:向右滑动
    swipeGesture.direction = [.Left, .Right]

    // 向 imageView 添加拖拽手势
    imageView?.addGestureRecognizer(swipeGesture)

6.2 swipeGesture 的设置

  • Objective-C

    1
    2
    // 获取滑动方向
    UISwipeGestureRecognizerDirection direction = swipeGesture.direction;
  • Swift

    1
    2
    // 获取滑动方向
    let direction: UISwipeGestureRecognizerDirection = swipeGesture.direction

6.3 自定义触摸响应事件处理

  • Objective-C

    1
    2
    3
    - (void)swipeClick:(UISwipeGestureRecognizer *)swipeGesture {

    }
  • Swift

    1
    2
    3
    func swipeClick(swipeGesture:UISwipeGestureRecognizer) {

    }
文章目录
  1. 1. 前言
  2. 2. 1、tapGesture 点击手势
    1. 2.1. 1.1 tapGesture 的创建
    2. 2.2. 1.2 tapGesture 的设置
    3. 2.3. 1.3 自定义触摸响应事件处理
  3. 3. 2、longPressGesture 长按手势
    1. 3.1. 2.1 longPressGesture 的创建
    2. 3.2. 2.2 longPressGesture 的设置
    3. 3.3. 2.3 自定义触摸响应事件处理
  4. 4. 3、rotationGesture 旋转手势
    1. 4.1. 3.1 rotationGesture 的创建
    2. 4.2. 3.2 rotationGesture 的设置
    3. 4.3. 3.3 自定义触摸响应事件处理
  5. 5. 4、pinchGesture 捏合手势
    1. 5.1. 4.1 pinchGesture 的创建
    2. 5.2. 4.2 pinchGesture 的设置
    3. 5.3. 4.3 自定义触摸响应事件处理
  6. 6. 5、panGesture 拖动手势
    1. 6.1. 5.1 panGesture 的创建
    2. 6.2. 5.2 panGesture 的设置
    3. 6.3. 5.3 自定义触摸响应事件处理
  7. 7. 6、swipeGesture 滑动手势
    1. 7.1. 6.1 swipeGesture 的创建
    2. 7.2. 6.2 swipeGesture 的设置
    3. 7.3. 6.3 自定义触摸响应事件处理
隐藏目录