zoukankan      html  css  js  c++  java
  • iphone练习之手势识别(双击、捏、旋转、拖动、划动、长按)UITapGestureRecognizer

    首先新建一个基于Sigle view Application的项目,名为GestureTest;我的项目结构如下:

    往viewController.xib文件里拖动一个imageView,并使覆盖整个屏幕,改动属性为:

     

    viewController.h文件:

     

    1.     #import <UIKit/UIKit.h>  

    2.       

    3.     @interface ViewController : UIViewController{  

    4.         IBOutlet UIImageView *imageView;  

    5.     }  

    6.     @property (nonatomic,retain)IBOutlet UIImageView *imageView;  

    7.     @end  

    并使xib文件里的imageView与之连接;

    然后是viewController.m文件的实现部分:

     

    [cpp]viewplaincopy

     

    1.     @synthesize imageView;  

    2.       

    3.     CGFloat lastScaleFactor=1;//放大、缩小  

    4.     CGFloat  netRotation;//旋转  

    5.     CGPoint netTranslation;//平衡  

    6.     NSArray *images;//图片数组  

    7.     int imageIndex=0;//数组下标  

    8.       

    9.     - (void)viewDidLoad  

    10.   {  

    11.       //1、创建手势实例,并连接方法handleTapGesture,点击手势  

    12.       UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTapGesture:)];  

    13.       //设置手势点击数,双击:点2下  

    14.       tapGesture.numberOfTapsRequired=2;  

    15.       // imageView添加手势识别  

    16.       [imageView addGestureRecognizer:tapGesture];  

    17.       //释放内存  

    18.       [tapGesture release];  

    19.         

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

    21.       UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinchGesture:)];  

    22.       [imageView addGestureRecognizer:pinchGesture];//imageView添加手势识别  

    23.       [pinchGesture release];  

    24.         

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

    26.       UIRotationGestureRecognizer *rotateGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotateGesture:)];  

    27.       [imageView addGestureRecognizer:rotateGesture];  

    28.       [rotateGesture release];  

    29.         

    30.       //4、拖手势  

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

    32.      // [imageView addGestureRecognizer:panGesture];  

    33.       [panGesture release];  

    34.         

    35.       //5、划动手势  

    36.       images=[[NSArray alloc]initWithObjects:@"cell.jpg",@"heihua.jpg",@"xuanyi.jpg", nil];  

    37.       //右划  

    38.       UISwipeGestureRecognizer *swipeGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];  

    39.       [imageView addGestureRecognizer:swipeGesture];  

    40.       [swipeGesture release];  

    41.       //左划  

    42.       UISwipeGestureRecognizer *swipeLeftGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];  

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

    44.       [imageView addGestureRecognizer:swipeLeftGesture];  

    45.       [swipeLeftGesture release];  

    46.         

    47.       //6、长按手势  

    48.       UILongPressGestureRecognizer *longpressGesutre=                                 [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongpressGesture:)];  

    49.       //长按时间为1秒  

    50.       longpressGesutre.minimumPressDuration=1;  

    51.       //允许15秒中运动  

    52.       longpressGesutre.allowableMovement=15;  

    53.       //所需触摸1次  

    54.       longpressGesutre.numberOfTouchesRequired=1;  

    55.       [imageView addGestureRecognizer:longpressGesutre];  

    56.       [longpressGesutre release];  

    57.         

    58.       [super viewDidLoad];  

    59.       // Do any additional setup after loading the view, typically from a nib.  

    60.   }  

    61.   //双击屏幕时会调用此方法,放大和缩小图片  

    62.   -(IBAction)handleTapGesture:(UIGestureRecognizer*)sender{  

    63.       //判断imageView的内容模式是否是UIViewContentModeScaleAspectFit,该模式是原比例,按照图片原时比例显示大小  

    64.       if(sender.view.contentMode==UIViewContentModeScaleAspectFit){  

    65.           //把imageView模式改成UIViewContentModeCenter,按照图片原先的大小显示中心的一部分在imageView  

    66.           sender.view.contentMode=UIViewContentModeCenter;  

    67.       }else{  

    68.           sender.view.contentMode=UIViewContentModeScaleAspectFit;  

    69.       }  

    70.   }  

    71.   //捏的手势,使图片放大和缩小,捏的动作是一个连续的动作  

    72.   -(IBAction)handlePinchGesture:(UIGestureRecognizer*)sender{  

    73.       //得到sender捏手势的大小  

    74.       CGFloat factor=[(UIPinchGestureRecognizer*)sender scale];  

    75.       if(factor>1){  

    76.           //图片放大  

    77.           sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor+(factor-1), (lastScaleFactor+(factor-1)));  

    78.                                                              

    79.       }else{  

    80.           //缩小  

    81.           sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor*factor, lastScaleFactor*factor);  

    82.                                                              

    83.       }  

    84.       //状态是否结束,如果结束保存数据  

    85.       if(sender.state==UIGestureRecognizerStateEnded){  

    86.           if(factor>1){  

    87.               lastScaleFactor+=(factor-1);  

    88.           }else{  

    89.               lastScaleFactor*=factor;  

    90.           }  

    91.       }  

    92.   }  

    93.   //旋转手势  

    94.   -(IBAction)handleRotateGesture:(UIGestureRecognizer*)sender{  

    95.       //浮点类型,得到sender的旋转度数  

    96.       CGFloat rotation=[(UIRotationGestureRecognizer*)sender rotation];  

    97.       //旋转角度CGAffineTransformMakeRotation  

    98.       CGAffineTransform transform=CGAffineTransformMakeRotation(rotation+netRotation);  

    99.       //改变图像角度  

    100.      sender.view.transform=transform;  

    101.      //状态结束,保存数据  

    102.      if(sender.state==UIGestureRecognizerStateEnded){  

    103.          netRotation+=rotation;  

    104.      }  

    105.         

    106.  }  

    107.  //拖手势  

    108.  -(IBAction)handlePanGesture:(UIGestureRecognizer*)sender{  

    109.      //得到拖的过程中的xy坐标  

    110.      CGPoint translation=[(UIPanGestureRecognizer*)sender translationInView:imageView];  

    111.      //平移图片CGAffineTransformMakeTranslation  

    112.      sender.view.transform=CGAffineTransformMakeTranslation(netTranslation.x+translation.x, netTranslation.y+translation.y);  

    113.      //状态结束,保存数据  

    114.      if(sender.state==UIGestureRecognizerStateEnded){  

    115.          netTranslation.x+=translation.x;  

    116.          netTranslation.y+=translation.y;  

    117.      }  

    118.        

    119.  }  

    120.  //划动手势  

    121.  -(IBAction)handleSwipeGesture:(UIGestureRecognizer*)sender{  

    122.      //划动的方向  

    123.      UISwipeGestureRecognizerDirection direction=[(UISwipeGestureRecognizer*) sender direction];  

    124.      //判断是上下左右  

    125.      switch (direction) {  

    126.          case UISwipeGestureRecognizerDirectionUp:  

    127.              NSLog(@"up");  

    128.              break;  

    129.          case UISwipeGestureRecognizerDirectionDown:  

    130.              NSLog(@"down");  

    131.              break;  

    132.          case UISwipeGestureRecognizerDirectionLeft:  

    133.              NSLog(@"left");  

    134.              imageIndex++;//下标++  

    135.              break;  

    136.          case UISwipeGestureRecognizerDirectionRight:  

    137.              NSLog(@"right");  

    138.              imageIndex--;//下标--  

    139.              break;  

    140.          default:  

    141.              break;  

    142.      }  

    143.      //得到不越界不<0的下标  

    144.      imageIndex=(imageIndex<0)?([images count]-1):imageIndex%[images count];  

    145.      //imageView显示图片  

    146.      imageView.image=[UIImage imageNamed:[images objectAtIndex:imageIndex]];  

    147.        

    148.  }  

    149.  //长按手势  

    150.  -(IBAction)handleLongpressGesture:(UIGestureRecognizer*)sender{  

    151.      //创建警告  

    152.      UIActionSheet *actionSheet=[[UIActionSheet alloc]initWithTitle:@"Image options" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Save Image",@"Copy", nil];  

    153.      //当前view显示警告  

    154.      [actionSheet showInView:self.view];  

    155.      [actionSheet release];  

    156.  }  

    157.  -(void)dealloc{  

    158.      [images release];  

    159.      [imageView release];  

    160.      [super dealloc];  

    161.  }  

     

    //单指单击
    2: UITapGestureRecognizer *singleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
    3: action:@selector(handleSingleFingerEvent:)];
    4: singleFingerOne.numberOfTouchesRequired = 1; //手指数
    5: singleFingerOne.numberOfTapsRequired = 1; //tap次数
    6: singleFingerOne.delegate = self;
    7:
    8: //单指双击
    9: UITapGestureRecognizer *singleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
    10: action:@selector(handleSingleFingerEvent:)];
    11: singleFingerTwo.numberOfTouchesRequired = 1;
    12: singleFingerTwo.numberOfTapsRequired = 2;
    13: singleFingerTwo.delegate = self;
    14:
    15: //双指单击
    16: UITapGestureRecognizer *doubleFingerOne = [[UITapGestureRecognizer alloc] initWithTarget:self
    17: action:@selector(handleDoubleFingerEvent:)];
    18: doubleFingerOne.numberOfTouchesRequired = 2;
    19: doubleFingerOne.numberOfTapsRequired = 1;
    20: doubleFingerOne.delegate = self;
    21:
    22: UITapGestureRecognizer *doubleFingerTwo = [[UITapGestureRecognizer alloc] initWithTarget:self
    23:    action:@selector(handleDoubleFingerEvent:)];
    24: doubleFingerTwo.numberOfTouchesRequired = 2;
    25: doubleFingerTwo.numberOfTapsRequired = 2;
    26: doubleFingerTwo.delegate = self;
    27:
    28: //如果不加下面的话,当单指双击时,会先调用单指单击中的处理,再调用单指双击中的处理
    29: [singleFingerOne requireGestureRecognizerToFail:singleFingerTwo];
    30: //同理双指亦是如此
    31: [doubleFingerOne requireGestureRecognizerToFail:doubleFingerTwo];
    32:
    33: [self.view addGestureRecognizer:singleFingerOne];
    34: [self.view addGestureRecognizer:singleFingerTwo];
    35: [self.view addGestureRecognizer:doubleFingerOne];
    36: [self.view addGestureRecognizer:doubleFingerTwo];
    37:
    38: [singleFingerOne release];
    39: [singleFingerTwo release];
    40: [doubleFingerOne release];
    41: [doubleFingerTwo release];

    处理事件的方法,代码:

    1: //处理单指事件
    2: - (void)handleSingleFingerEvent:(UITapGestureRecognizer *)sender
    3: {
    4: if (sender.numberOfTapsRequired == 1) {
    5: //单指单击
    6: NSLog(@"单指单击");
    7: }else if(sender.numberOfTapsRequired == 2){
    8: //单指双击
    9: NSLog(@"单指双击");
    10: }
    11: }
    12: //处理双指事件
    13: - (void)handleDoubleFingerEvent:(UITapGestureRecognizer *)sender
    14: {
    15: if (sender.numberOfTapsRequired == 1) {
    16: //双指单击
    17: NSLog(@"双指单击");
    18: }else if(sender.numberOfTapsRequired == 2){
    19: //双指双击
    20: NSLog(@"双指双击");
    21: }
    22: }

    将相应代码复制到你的工程中即可使用,由于代码中已经有详细的解释说明,这里就不在重复解释了。

    代码中只是列举了单指与双指对于单击或多击的处理,同理多指的操作需修改numberOfTouchesRequired属性,对点击的次数需修改numberOfTapsRequired属性。

    对于其他手势例如UISwipeGestureRecognizerUILongPressGestureRecognizer,UILongPressGestureRecognizer的操作使用类似处理。

  • 相关阅读:
    jupyter notebook代码添加行号(菜单中点击view后没有toggle line numbers选项)
    深度学习:tensorflow中激励函数的实现
    深度学习:padding、卷积、stride的计算
    深度学习:mAP(mean average precision)
    java实现桶排序
    java 数组实现队列和栈
    五步学习法
    技术团队组织架构
    Redis的高可用:哨兵和集群
    Redis限流的实现方式有3种
  • 原文地址:https://www.cnblogs.com/ChouDanDan/p/5150544.html
Copyright © 2011-2022 走看看