iOS 手势(UIGestureRecognizer)操作

本文摘自:AppCoda

UIKit中包含了UIGestureRecognizer类来处理手势识别,UIGestureRecognizer是一个抽象类,用于检测发生在UIView上预定义的手势。UIGestureRecognizer 提供了一些子类来处理具体的手势行为,如下:

  • UITapGestureRecognizer: 该类处理View上的点击Tap操作(任意手指、任意次数的点击)该操作很常见

  • UISwipeGestureRecognizer: 该类处理滑动Swipe操作(上、下、左、右)如:照片应用中滑动查看下一张照片

  • UIPanGestureRecognizer: 该类处理拖拽Pan操作,如:将一个View从一个点拖拽到另一个点

  • UIPinchGestureRecognizer: 该类处理向里或向外捏和Pinch操作 (任意方向)如:放大或缩小某张图片

  • UIRotationGestureRecognizer: 该类处理旋转Rotation操作,如:双指旋转某个view

  • UILongPressGestureRecognizer: 该类处理长按LongPress操作

  • UIScreenEdgePanGestureRecognizer:该类是ios7上添加的,看起来像Pan手势,它是检测屏幕边缘的pan手势的,系统在某些controller转场的时候会使用这个手势。

所有的手势对象都会执行perform一个响应事件action,手势对象会带有相关属性设置,如:手指数目,点击次数等,我们将手势处理事件定义如下:

    -(void)handleMyTapGestureWithGestureRecognizer:(UITapGestureRecognizer *)gestureRecognizer;

下面简单说下各个手势的例子,详细代码请查看原文,在原文demo上我添加了UIScreenEdgePanGestureRecognizer的例子,见github:GestureDemo

  • UITapGestureRecognizer 代码片段

初始化手势:

1
2
3
4
5
6
7
8
9
// 创建 单个手指单次点击 手势对象
UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTapGesture:)];
[self.testView addGestureRecognizer:singleTapGestureRecognizer];

// 创建 双手指两次点击 手势对象
UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTapGesture:)];
doubleTapGestureRecognizer.numberOfTapsRequired = 2;
doubleTapGestureRecognizer.numberOfTouchesRequired = 2;
[self.testView addGestureRecognizer:doubleTapGestureRecognizer];

手势响应事件

1
2
3
4
5
6
7
8
9
10
-(void)handleSingleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer
{
    // 处理单次点击事件
    ...
}
-(void)handleDoubleTapGesture:(UITapGestureRecognizer *)tapGestureRecognizer
{
  // 处理双手指两次点击事件
  ...
}
  • UISwipeGestureRecognizer 代码片段

初始化手势:

1
2
3
4
5
6
// 创建 滑动 手势对象
UISwipeGestureRecognizer *swipeRightOrange = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(slideToRightWithGestureRecognizer:)];
// 滑动方向
swipeRightOrange.direction = UISwipeGestureRecognizerDirectionRight;

[self.viewOrange addGestureRecognizer:swipeRightOrange];

手势响应事件

1
2
3
4
5
6
  -(void)slideToRightWithGestureRecognizer:(UISwipeGestureRecognizer *)gestureRecognizer
    {
      // 处理向右滑动事件
      ...
  }
  
  • UIPanGestureRecognizer 代码片段

初始化手势:

1
2
3
// 创建 拖拽 手势对象
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveViewWithGestureRecognizer:)];
[self.testView addGestureRecognizer:panGestureRecognizer];

手势响应事件

1
2
3
4
5
6
  -(void)moveViewWithGestureRecognizer:(UIPanGestureRecognizer *)panGestureRecognizer
    {
      // 处理拖拽事件
      ...
  }
  
  • UIPinchGestureRecognizer 代码片段

初始化手势:

1
2
3
// 创建 捏合 手势对象
UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchWithGestureRecognizer:)];
[self.testView addGestureRecognizer:pinchGestureRecognizer];

手势响应事件

1
2
3
4
5
6
  
-(void)handlePinchWithGestureRecognizer:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
    // 处理捏合事件
    ...
}
  • UIRotationGestureRecognizer 代码片段

初始化手势:

1
2
3
// 创建 旋转 手势对象
UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(handleRotationWithGestureRecognizer:)];
[self.testView addGestureRecognizer:rotationGestureRecognizer];

手势响应事件

1
2
3
4
5
6
  
-(void)handleRotationWithGestureRecognizer:(UIRotationGestureRecognizer *)rotationGestureRecognizer
{
    // 处理旋转事件
    ...
}
  • UILongPressGestureRecognizer 代码片段

初始化手势:

1
2
3
// 创建 长按 手势对象
UILongPressGestureRecognizer *longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressWithGestureRecognizer:)];
[self.testView addGestureRecognizer:longPressGestureRecognizer];

手势响应事件

1
2
3
4
5
6
  
-(void)handleLongPressWithGestureRecognizer:(UILongPressGestureRecognizer *)longPressGestureRecognizer
{
    // 处理长按事件
    ...
}
  • UIScreenEdgePanGestureRecognizer 代码片段

初始化手势:

1
2
3
4
5
6
 // 创建屏幕边缘手势(优先级高于其他手势)
UIScreenEdgePanGestureRecognizer *edgePanGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc]
                                                              initWithTarget:self
                                                              action:@selector(handleEdgePanWithGestureRecognizer:)];
edgePanGestureRecognizer.edges = UIRectEdgeLeft;           // 左侧边缘响应
[self.view addGestureRecognizer:edgePanGestureRecognizer]; // view添到self.view上

手势响应事件

1
2
3
4
5
6
7
8
9
10
11

-(void)handleEdgePanWithGestureRecognizer:(UIScreenEdgePanGestureRecognizer *)gesture
{
    if(UIGestureRecognizerStateBegan == gesture.state ||
       UIGestureRecognizerStateChanged == gesture.state)
    {
        // 根据被触摸手势的view计算得出坐标值
        CGPoint translation = [gesture translationInView:gesture.view];
        _showView.center = CGPointMake(self.view.bounds.size.width / 2 + translation.x, self.view.bounds.size.height);
    }
}