iphone練習之手勢識別(雙擊、捏、旋轉、拖動、划動、長按)

首先新建一個基於Sigle view Application的項目,名爲GestureTest;個人項目結構以下:數組


往viewController.xib文件裏拖動一個imageView,並使覆蓋整個屏幕,改動屬性爲:ide


viewController.h文件:ui

[cpp]  view plain copy
  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文件的實現部分:atom

[cpp]  view plain copy
  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.     //一、建立手勢實例,並鏈接方法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.     //二、手勢爲捏的姿式:按住option按鈕配合鼠標來作這個動做在虛擬器上  
  21.     UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinchGesture:)];  
  22.     [imageView addGestureRecognizer:pinchGesture];//imageView添加手勢識別  
  23.     [pinchGesture release];  
  24.       
  25.     //三、旋轉手勢:按住option按鈕配合鼠標來作這個動做在虛擬器上  
  26.     UIRotationGestureRecognizer *rotateGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotateGesture:)];  
  27.     [imageView addGestureRecognizer:rotateGesture];  
  28.     [rotateGesture release];  
  29.       
  30.     //四、拖手勢  
  31.     UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanGesture:)];  
  32.    // [imageView addGestureRecognizer:panGesture];  
  33.     [panGesture release];  
  34.       
  35.     //五、划動手勢  
  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.     //六、長按手勢  
  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. }