UIGestureRecognizer手势识别器

原创 2015年11月21日 15:24:34

监听触摸事件的做法

• 如果想监听一个view上面的触摸事件,一个做法
    ➢ 自定义⼀个view
    ➢ 实现view的touches方法,在方法内部实现具体处理代码

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

另一个做法是手势识别器
• iOS 3.2之后,苹果推出了⼿势识别功能(Gesture Recognizer),在触摸事件处理⽅面,⼤大简化了开发者的开发难度

• 为了完成手势识别,必须借助于手势识别器----UIGestureRecognizer
• 利⽤用UIGestureRecognizer,能轻松识别⽤用户在某个view上面做的一些常见手势
• UIGestureRecognizer是⼀一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势

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


手势识别器的用法
• 每一个手势识别器的用法都差不多,比如UITapGestureRecognizer的使用步骤如下
➢ 创建手势识别器对象
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init];
➢ 设置手势识别器对象的具体属性
// 连续敲击2次
tap.numberOfTapsRequired = 2;
// 需要2根手指一起敲击
tap.numberOfTouchesRequired = 2;
➢ 添加手势识别器到对应的view上
[self.iconView addGestureRecognizer:tap];
➢ 监听手势的触发
[tap addTarget:self action:@selector(tapIconView:)];


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

 
stroyboardAndTest


//
//  ViewController.m
//  gestureRecognizer
//
//  Created by ys on 15/11/21.
//  Copyright (c) 2015年 ys. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<UIGestureRecognizerDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    
    /**
     手势识别器新建->添加->监听
     */
//    //新建手势识别器,这些识别器均继承自UIGestureRecognizer
//    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
//    //将手势识别器添加到view
//    [self.imageView addGestureRecognizer:tap];
//    //监听手势识别器
//    [tap addTarget:self action:@selector(tapAction)];
    
    /*
     *点击识别器
     */
    [self.imageView addGestureRecognizer:[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction)]];
    
    
    /*
     *长按识别器
     */
    [self.imageView addGestureRecognizer:[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPressAction)]];
    
    
    /*
     *滑动识别器
     */
    UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction)];
    /*
     *滑动方向
     */
    swipe.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.imageView addGestureRecognizer:swipe];
    
    
    /*
     *旋转识别器
     */
    UIRotationGestureRecognizer *rotate = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotationAction:)];
    rotate.delegate = self;
    [self.imageView addGestureRecognizer:rotate];

    
    /**
     *  缩放识别器
     */
    UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinchAction:)];
    pinch.delegate = self;
    [self.imageView addGestureRecognizer:pinch];

    
    /**
     *移动识别器
     */
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panAction:)];
    [self.imageView addGestureRecognizer:pan];
    
}




-(void)tapAction
{
    NSLog(@"tap------");
}


-(void)longPressAction
{
    NSLog(@"longPress------");
}


-(void)swipeAction
{
    NSLog(@"swipe----left");
}


-(void)rotationAction:(UIRotationGestureRecognizer *)rotate
{
    rotate.view.transform = CGAffineTransformRotate(rotate.view.transform, rotate.rotation);
    /**
     *  清零rotation可以解决旋转度数累积(数据冗余)造成旋转速度过快的bug
     */
    rotate.rotation = 0;
}


-(void)pinchAction:(UIPinchGestureRecognizer *)pinch
{
    pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale);
    pinch.scale = 1;//同rotation一样解决数据冗余问题
}


-(void)panAction:(UIPanGestureRecognizer *)pan
{
    CGPoint point = [pan translationInView:pan.view];
    CGPoint center = pan.view.center;
    center.x += point.x;
    center.y += point.y;
    pan.view.center = center;
    [pan setTranslation:CGPointZero inView:pan.view];//清零位移
}




/**
 *  手势识别器代理方法shouldRecognizeSimultaneouslyWithGestureRecognizer
 *
 *  @return 是否可以两个识别器同时发生作用,此demo同时监听旋转和缩放
 */
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}


@end


UIGestureRecognizer,手势处理,点击,长按,拖动,左右划动

对于移动端,由于用户都是通过手指触摸来操作的,所以对于手势的处理是必不可少的。下面详细谈谈有哪几种手势操作。 1.点击,长按,拖动,左划,右划(上划下划)。 2.闲话不多说,直接看代码。 #impor...
  • qq_27325349
  • qq_27325349
  • 2015年12月27日 10:03
  • 1151

IOS用户事件传递与UIGestureRecognizer的一些思考

本人第一次发表技术文章,哪里有不足之处还请多多包涵,望各位提出宝贵得意见。 在内容中有哪些说的不对的地方还请多多指出,只有在讨论中才会有进步! 我们在开发中总是会遇到一些用户事件的处理,可是他得消息链...
  • war3Rexxar
  • war3Rexxar
  • 2015年03月13日 14:13
  • 1213

UIGestureRecognizer的一些简单的方法总结

- (void)viewDidLoad {     [super viewDidLoad];     // Do any additional setup after loading the v...
  • Baby_beautiful
  • Baby_beautiful
  • 2015年04月22日 11:53
  • 264

ios的手势操作之UIGestureRecognizer浅析

一、概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式:  - (void)touchesBegan:(NSSet *)touche...
  • songzhuo1991
  • songzhuo1991
  • 2015年12月25日 12:39
  • 167

IOS开发之手势——UIGestureRecognizer 共存

IOS开发之手势——UIGestureRecognizer 共存  在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesE...
  • meegomeego
  • meegomeego
  • 2013年03月22日 10:37
  • 468

IOS开发之手势—UIGestureRecognizer 共存

IOS开发之手势——UIGestureRecognizer 共存  在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesE...
  • k12104
  • k12104
  • 2013年02月19日 10:01
  • 387

ios的手势操作之UIGestureRecognizer浅析

 转自:http://blog.csdn.net/likendsl/article/details/7554150 一、概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由...
  • pq1051288217
  • pq1051288217
  • 2015年11月15日 18:07
  • 72

IOS开发之手势——UIGestureRecognizer 共存

在 iPhone 或 iPad 的开发中,除了用 touchesBegan / touchesMoved / touchesEnded 这组方法来控制使用者的手指触控外,也可以用 UIGestureR...
  • liulushi_1988
  • liulushi_1988
  • 2013年02月27日 15:42
  • 249

ios的手势操作之UIGestureRecognizer浅析

一、概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式:  - (void)touchesBegan:(NSSet *)touche...
  • LiMi512
  • LiMi512
  • 2016年07月05日 09:55
  • 66

ios的手势操作之UIGestureRecognizer浅析

一、概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式:  - (void)touchesBegan:(NSSet *)touche...
  • u011118092
  • u011118092
  • 2016年07月25日 09:37
  • 111
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UIGestureRecognizer手势识别器
举报原因:
原因补充:

(最多只允许输入30个字)