手势识别

监听触摸事件的做法

  • 如果想监听一个view上面的触摸事件,之前的做法是
    1.自定义一个view
    2.实现view的touches方法,在方法内部实现具体处理代码
  • 注意:通过touches方法监听view触摸事件,有很明显的几个缺点
    1.必须得自定义view
    2.由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件
    3.不容易区分用户的具体手势行为
  • iOS 3.2之后,苹果推出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度

UIGestureRecognizer的使用

 1.什么是UIGestureRecognizer:
       UIGestureRecognizer手势识别器
  2.优点 :
       利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势
  3.注意点:
      UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势
  4.UIGestureRecognizer的子类
        UITapGestureRecognizer(敲击)
        UIPinchGestureRecognizer(捏合,用于缩放)
        UIPanGestureRecognizer(拖拽)
        UISwipeGestureRecognizer(轻扫)
        UIRotationGestureRecognizer(旋转)
        UILongPressGestureRecognizer(长按)

手势的使用

注意:在使用手势时,涉及到形变的手势,不能使用make的transform方法
//self.imageV.transform = CGAffineTransformMakeTranslation(point.x, point.y);
因为当移动完毕后,在次点击拖动时,图片会回到最开始的位置,make的transform方法是相对于最原始的位置进行形变的而且只会执行一次,所以在拖动的时候,总是会回到起始点后,所以在拖动过程中,就会出现震颤的效果;
可以使用没有make的transform方法
self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
因为这个方法的形变值,是相对上一次而非最初的状态的形变值,因此获取相对最初位置的偏移量是累加了之前的偏移量的值,获取到的偏移值会比实际的偏移值大很多,但是需要的偏移量是要相对图片最初位置的偏移量,所以,在这里需要调用setTranslation: inView:方法,在拖动时,将上一次的偏移值清空,以获取拖动时相对初始位置的偏移值.

  • 1.UITapGestureRecognizer(敲击)
    /*************手势点按*************/
-(void)tapTestGes{
    //创建手势
    UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGes)];//当图片没有接受到手势的触摸事件后,不会调用tap方法
    //给图片添加手势
    [self.imageV addGestureRecognizer:tap];
}
//手势的方法
-(void)tapGes{
    NSLog(@"%s",__func__);
}
  • 2.UIPinchGestureRecognizer(捏合,用于缩放)
    /*************捏合手势*************/
-(void)pinchGes{
    UIPinchGestureRecognizer * pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGes:)];
    pinch.delegate = self;
    [self.imageV addGestureRecognizer:pinch];
}
//捏合手势的方法
-(void)pinchGes:(UIPinchGestureRecognizer *)pinch
{
    self.imageV.transform = CGAffineTransformScale(self.imageV.transform, pinch.scale, pinch.scale);//如果缩放倍数写成常数,那么久只能放大或缩小
    [pinch setScale:1];
}
  • 3.UIPanGestureRecognizer(拖拽)
    /*************拖动手势*************/
-(void)panGes{
    UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGes:)];
    [self.imageV addGestureRecognizer:pan];
}
//平移图片
-(void)panGes:(UIPanGestureRecognizer *)pan
{
    //获取图片相对最开始时的自己的位置
    CGPoint point = [pan translationInView:self.imageV];
    self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, point.x, point.y);
    //重置图片的移动距离(相对于上一次)
        NSLog(@"%@",NSStringFromCGPoint(point));
    [pan setTranslation:CGPointZero inView:self.imageV];
}
  • 4.UISwipeGestureRecognizer(轻扫)
    //设置轻扫方向
    1.只有在同一水平方向上的手势可以拼接,不在同一水平方向上的手势不可以拼接
    2.拼接以后只能识别图片被轻扫了,但不能识别往哪个方向轻扫
    3.要想识别图片是往哪个方向轻扫了,需要添加两个轻扫手势对象,其中一个手势对象必须指明要滑动的方向
    /*************轻扫手势*************/
-(void)swipeGes{
    //创建轻扫手势
    UISwipeGestureRecognizer * swipe1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
    //设置轻扫方向
    swipe1.direction =  UISwipeGestureRecognizerDirectionLeft;
    //给图片添加轻扫手势
    [self.imageV addGestureRecognizer:swipe1];
    //创建第二个轻扫手势
    UISwipeGestureRecognizer * swipe2 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGes:)];
    //给图片添加第二个轻扫手势
    [self.imageV addGestureRecognizer:swipe2];
}
//轻扫手势方法的实现
-(void)swipeGes:(UISwipeGestureRecognizer *)swipe
{
    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) {
        NSLog(@"向左轻扫图片");
    }else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
        NSLog(@"向右轻扫图片");
    }else{
    NSLog(@"无法识别轻扫图片的方向");
    }
}
  • 5.UIRotationGestureRecognizer(旋转)
    /*************旋转手势*************/
-(void)rotationGes{
    UIRotationGestureRecognizer * rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGes:)];
    rotation.delegate = self;
    [self.imageV addGestureRecognizer:rotation];
}
//旋转手势的方法
-(void)rotationGes:(UIRotationGestureRecognizer *)rotation
{
    self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, rotation.rotation);
    [rotation setRotation:0];
}
  • 6.UILongPressGestureRecognizer(长按)
    /*************手势长按*************/
-(void)longPressGes
{
    //创建长按手势
    UILongPressGestureRecognizer * longP = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPGes:)];
    //给图片添加长按手势
    [self.imageV addGestureRecognizer:longP];
}
//当长按的时候会调用此方法
-(void)longPGes:(UILongPressGestureRecognizer *)longP
{
    //判断长按手势的状态.因此,方法应该传入长按手势对象
    if (longP.state == UIGestureRecognizerStateBegan) {
        NSLog(@"开始长按");
    }else if (longP.state == UIGestureRecognizerStateChanged){
        NSLog(@"开始滑动");
    }else if (longP.state == UIGestureRecognizerStateEnded){
        NSLog(@"结束长按");
    }
}
  • 设置是否允许手指触摸,需要设置代理,并实现下面的代理方法
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    //获取当前触摸点的位置
    CGPoint curP = [touch locationInView:self.imageV];
    //设置可触摸的范围(左侧不可触摸,右侧可以触摸)
    if (curP.x <= self.imageV.frame.size.width * 0.5) {
        NSLog(@"%@",NSStringFromCGPoint(curP));
        NSLog(@"不可以触摸");
        return NO;
    }else{
        NSLog(@"%@",NSStringFromCGPoint(curP));
        NSLog(@"可以触摸");
        return YES;
    }
  • 设置是否允许接受多个手势,设置对应手势的代理,并实现下面的dialing方法
//实现代理方法
//同时执行多个手势操作
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容