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

首先新建一個基於Sigle view Application的項目,名爲GestureTest;我的項目結構如下:


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


viewController.h文件:

 

[cpp]viewplaincopy

 

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. 

發佈了19 篇原創文章 · 獲贊 17 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章