iOS开发笔记--多手势事件

转载 2015年07月07日 14:50:49

ios多手势事件


开发ios应用时我们经常用到多手势来处理事情,如给scrollView增加点击事件,scrollView不能响应view的touch事件,但有时候却要用到多手势事件,那么我们可以给这个scrollView增加自己的手指事件。给imageView增加点击、放大、旋转等都可以通过多手势来完成。
下面就介绍下各种的手势的使用方法,及注意事项。
- (void)viewDidLoad

 

{

    [super viewDidLoad];

    //为了能响应多手势事件,imageView的userInteractionEnabled属性要设为YES.

    self.imageView.userInteractionEnabled=YES;

    

    //1、手指点击事件

    //单指单击

    UITapGestureRecognizer *singleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self

                                                                                     action:@selector(fingerIncident:)];

//手指数

    singleFingerOne.numberOfTouchesRequired = 1;

//点击次数        

    singleFingerOne.numberOfTapsRequired = 1;  

//设置代理方法         

    singleFingerOne.delegateself;    

//增加事件者响应者,                 

    [self.imageView addGestureRecognizer:singleFingerOne]; 

    

    //单指双击

    UITapGestureRecognizer *singleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self

                                                                                     action:@selector(fingerIncident:)];

    singleFingerTwo.numberOfTouchesRequired = 1;

    singleFingerTwo.numberOfTapsRequired = 2;

    singleFingerTwo.delegateself;

    [self.imageView addGestureRecognizer:singleFingerTwo];

    

    

    //双指单击

    UITapGestureRecognizer *doubleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self

                                                                                     action:@selector(fingerIncident:)];

    doubleFingerOne.numberOfTouchesRequired = 2;

    doubleFingerOne.numberOfTapsRequired = 1;

    doubleFingerOne.delegateself;

    [self.imageView addGestureRecognizer:doubleFingerOne];

    

    //双指双击

    UITapGestureRecognizer *doubleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self

                                                                                     action:@selector(fingerIncident:)];

    doubleFingerTwo.numberOfTouchesRequired = 2;

    doubleFingerTwo.numberOfTapsRequired = 2;

    doubleFingerTwo.delegateself;

    [self.imageView addGestureRecognizer:doubleFingerTwo];

    

    //如果不加下面的话,当单指双击时,会先调用单指单击中的处理,再调用单指双击中的处理

    [singleFingerOne requireGestureRecognizerToFail:singleFingerTwo];

    //同理双指也是如此

    [doubleFingerOne requireGestureRecognizerToFail:doubleFingerTwo];


    

    

    //2、手势为捏的姿势:按住option按钮配合鼠标来做这个动作在虚拟器上

    UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:selfaction:@selector(handlePinchGesture:)];

    [self.imageViewaddGestureRecognizer:pinchGesture];//imageView添加手势识别

    [pinchGesture release];

    

    //3、旋转手势:按住option按钮配合鼠标来做这个动作在虚拟器上

    UIRotationGestureRecognizer *rotateGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:selfaction:@selector(handleRotateGesture:)];

    [self.imageView addGestureRecognizer:rotateGesture];

    [rotateGesture release];

    

    //4、拖手势

    UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizeralloc]initWithTarget:self action:@selector(handlePanGesture:)];

    [self.imageView addGestureRecognizer:panGesture];

    [panGesture release];

    

    //当实现上面拖手势(UIPanGestureRecognizer)后将不能响应下面的左右划(UISwipeGestureRecognizer)事件,事件会被拖手势栏截,所以左右划和拖手势只能选其一

    //右划

    UISwipeGestureRecognizer *swipeGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:selfaction:@selector(handleSwipeGesture:)];

    [self.imageView addGestureRecognizer:swipeGesture];

    [swipeGesture release];

    //左划

    UISwipeGestureRecognizer *swipeLeftGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:selfaction:@selector(handleSwipeGesture:)];

    swipeGesture.direction=UISwipeGestureRecognizerDirectionLeft;//不设置黑夜是右

    [self.imageView addGestureRecognizer:swipeLeftGesture];

    [swipeLeftGesture release];

    

    UILongPressGestureRecognizer *longpressGesutre=[[UILongPressGestureRecognizer alloc]initWithTarget:self

                                                                                              action:@selector(handleLongpressGesture:)];

    //长按时间为1

    longpressGesutre.minimumPressDuration=0.5;

    //允许15秒中运动

    longpressGesutre.allowableMovement=3;

    //所需触摸1

    longpressGesutre.numberOfTouchesRequired=1;

    [self.imageView addGestureRecognizer:longpressGesutre];

    [longpressGesutre release];

}


//手指点击事件

- (void)fingerIncident:(UITapGestureRecognizer *)sender

{

    if (sender.numberOfTouchesRequired==1) {

        //单指点击事件

        if(sender.numberOfTapsRequired == 1) {

            //单指单击

            NSLog(@"单指单击");

            [sender.view.layer removeAllAnimations];

        }

        else if(sender.numberOfTapsRequired ==2 ){

            //单指双击

            NSLog(@"单指双击");

        }

    }

    else if (sender.numberOfTouchesRequired==2) {

        //双指点击事件

        if(sender.numberOfTapsRequired == 1) {

            //双指单击

            NSLog(@"双指单击");

        }

        else if(sender.numberOfTapsRequired ==2 ){

            //双指双击

            NSLog(@"双指双击");

        }

    }

}


//手指左右滑动事件

-(void)handleSwipeGesture:(UISwipeGestureRecognizer *)sender{

    if (sender.direction==UISwipeGestureRecognizerDirectionLeft) {

        NSLog(@"左滑");

    }

    else{

        NSLog(@"右滑");

    }

}


//手指捏事件

-(void)handlePinchGesture:(UIPinchGestureRecognizer *)sender{

    NSLog(@"");

    

    if([sender state] == UIGestureRecognizerStateEnded) {

        lastScale = 1.0;

        return;

    }

    

    CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);

    

    CGAffineTransform newTransform =CGAffineTransformScale(sender.view.transform, scale, scale);

    

    [sender.view setTransform:newTransform];

    lastScale = [sender scale];

}


//手指旋转事件

-(void)handleRotateGesture:(UIRotationGestureRecognizer*)sender{

    NSLog(@"旋转");

    

    NSLog(@"sender.scale=%f",sender.rotation);

    NSLog(@"sender.velocity=%f",sender.velocity);


   sender.view.transform=CGAffineTransformRotate(sender.view.transform, sender.rotation);

    sender.rotation=0;

}


//手指拖事件

-(void)handlePanGesture:(UIPanGestureRecognizer *)sender{

    NSLog(@"");

    NSLog(@"sender%@",sender);

    CGPoint translation=[(UIPanGestureRecognizer*)sendertranslationInView:self.view];

    

    //开始

    if (sender.state==UIGestureRecognizerStateBegan) {

        x=sender.view.center.x;

        y=sender.view.center.y;

    }

    //进行中

    if (sender.state==UIGestureRecognizerStateChanged) {

        sender.view.center=CGPointMake(x+translation.x,y+translation.y);

    }

    //结束

    if (sender.state==UIGestureRecognizerStateEnded) {

        sender.view.center=CGPointMake(x+translation.x,y+translation.y);

    }

}


//手指长按事件

-(void)handleLongpressGesture:(UILongPressGestureRecognizer*)sender{

    NSLog(@"长按");

    if (sender.state==UIGestureRecognizerStateBegan) {

        CABasicAnimation* rotationAnimation_ = [CABasicAnimationanimationWithKeyPath:@"transform.rotation.z"];

        //角度转弧度

        rotationAnimation_.fromValue = [NSNumbernumberWithFloat:(-0.02)];

        rotationAnimation_.toValue = [NSNumber numberWithFloat:(0.02)];

        //动画时间

        rotationAnimation_.duration = 0.1f;

        //动画次数

        rotationAnimation_.repeatCount=FLT_MAX;

        //回退动画

        rotationAnimation_.autoreverses = YES;

        //动画开始结束的快慢,设置为加速

        rotationAnimation_.timingFunction = [CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseInEaseOut];

        [[sender.view layeraddAnimation:rotationAnimation_forKey:@"revItUpAnimation"];

    }

}

《iOS开发笔记—事件与手势》

一、多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象、同一个变量、同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数...
  • hzyfjpt_
  • hzyfjpt_
  • 2016年09月06日 14:43
  • 74

IOS开发——自定义手势(拖动UIPanGestureRecognizer)

#import "HomePage.h" @interface HomePage () @property (strong, nonatomic) UIScrollView *gBootS...
  • u012881779
  • u012881779
  • 2014年04月30日 16:22
  • 1791

【iOS开发】事件处理之手势识别(一)

手势识别手势识别将低级别事件处理代码转换成更高一级的行动。它们是对连接至一个视图,它允许,以便向操作进行响应的控制的方式做对象。手势识别解释触摸以确定它们是否对应于特定的手势,诸如滑动,挤压或转动。如...
  • Hanrovey
  • Hanrovey
  • 2016年06月07日 13:18
  • 5897

ios开发之手势动作状态细分state,同一视图添加两个手势

1.比如拖拽一个视图,形成类似scrollView的翻页形式 在拖拽的方法里判断拖拽的状态state属性,根据状态不同执行自己需要的效果。 2.同一视图添加两个手势,需要使用手势的代理方法。允许此...
  • zx6268476
  • zx6268476
  • 2015年08月12日 18:49
  • 895

史上最全IOS的touch事件手势使用方法

以下内容源于本人整理,部分来源于网络,如有侵权行为或错误之处还望指正 请联系邮箱huiyutianshi@qq.com关于touch事件的手势和事件都是基于UIRrsponder的 UIRespond...
  • q562679764
  • q562679764
  • 2015年11月23日 22:43
  • 1618

ios开发手势事件。

为了完成⼿手势识别,必须借助于⼿手势识别器----UIGestureRecognizer •利⽤用UIGestureRecognizer,能轻松识别⽤用户在某个view上⾯面做的⼀一些常见⼿手势 ...
  • txl444363699
  • txl444363699
  • 2016年01月31日 23:46
  • 143

【转】ionic之AngularJS手势事件

ionic开发app时,常会用到很多的手势,下面是推荐一篇有关手势的介绍。 原文链接: http://www.ionic.ren/2015/12/23/ionic%E4%B9%8Bangularjs...
  • Jiaen188
  • Jiaen188
  • 2017年08月01日 22:35
  • 375

iOS开发中多手势冲突解决方案

iOS开发中多手势冲突解决方案iOS开发中我们经常会使用到手势,合理的运用手势会使我们的app拥有更好的体验,但是在使用手势的同时也要注意避免手势和手势间,以及手势和其他控件间的冲突。本文就主要介绍在...
  • wlaizff
  • wlaizff
  • 2016年09月07日 17:25
  • 4213

Android手势事件分发过程分析

Android手势事件传递分析
  • xu_fu
  • xu_fu
  • 2014年06月21日 18:02
  • 4248

ios开发 - 手势捏合笔记

- (void) handlePinches:(UIPinchGestureRecognizer*)paramSender{ if (paramSender.state == UIGestureRec...
  • cy19929
  • cy19929
  • 2014年04月17日 15:09
  • 453
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS开发笔记--多手势事件
举报原因:
原因补充:

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