ios手勢識別(雙擊、捏、旋轉、拖動、划動、長按, 上下左右滑動)

一、概述

iPhone中處理觸摸屏的操作,在3.2之前是主要使用的是由UIResponder而來的如下4種方式:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

但是這種方式甄別不同的手勢操作實在是麻煩,需要你自己計算做不同的手勢分辨。後來。。。

蘋果就給出了一個比較簡便的方式,就是使用UIGestureRecognizer

二、UIGestureRecognizer

UIGestureRecognizer基類是一個抽象類,我們主要是使用它的子類(名字包含鏈接,可以點擊跳到ios Developer library,看官方文檔):

從名字上我們就能知道, Tap(點擊)、Pinch(捏合)、Rotation(旋轉)、Swipe(滑動,快速移動,是用於監測滑動的方向的)、Pan (拖移,慢速移動,是用於監測偏移的量的)以及 LongPress(長按)。

舉個例子,可以在viewDidLoad函數裏面添加:

  1. -(void) viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. // Do any additional setup after loading the view from its nib.
  5. UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
  6. [self.view addGestureRecognizer:panRecognizer];//關鍵語句,給self.view添加一個手勢監測;
  7. panRecognizer.maximumNumberOfTouches = 1;
  8. panRecognizer.delegate = self;
  9. [panRecognizer release];
  10. }
其它手勢方法類似。

其核心就是設置delegate和在需要手勢監測的view上使用addGestureRecognizer添加指定的手勢監測。

當然要記得在作爲delegate的view的頭文件加上<UIGestureRecognizerDelegate>。

不過有些手勢是關聯的,怎麼辦呢?例如 Tap 與 LongPress、Swipe與 Pan,或是 Tap 一次與Tap 兩次。

手勢識別是具有互斥的原則的比如單擊和雙擊,如果它識別出一種手勢,其後的手勢將不被識別。所以對於關聯手勢,要做特殊處理以幫助程序甄別,應該把當前手勢歸結到哪一類手勢裏面。

比如,單擊和雙擊並存時,如果不做處理,它就只能發送出單擊的消息。爲了能夠識別出雙擊手勢,就需要做一個特殊處理邏輯,即先判斷手勢是否是雙擊,在雙擊失效的情況下作爲單擊手勢處理。使用

[A requireGestureRecognizerToFail:B]函數,它可以指定當A手勢發生時,即便A已經滿足條件了,也不會立刻觸發會等到指定的手勢B確定失敗之後才觸發。

  1. - (void)viewDidLoad
  2. {
  3. // 單擊的 Recognizer
  4. UITapGestureRecognizer* singleRecognizer;
  5. singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(SingleTap:)];
  6. //點擊的次數
  7. singleTapRecognizer.numberOfTapsRequired = 1; // 單擊
  8. //給self.view添加一個手勢監測;
  9. [self.view addGestureRecognizer:singleRecognizer];
  10. // 雙擊的 Recognizer
  11. UITapGestureRecognizer* double;
  12. doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(DoubleTap:)];
  13. doubleTapRecognizer.numberOfTapsRequired = 2; // 雙擊
  14. //關鍵語句,給self.view添加一個手勢監測;
  15. [self.view addGestureRecognizer:doubleRecognizer];
  16. // 關鍵在這一行,雙擊手勢確定監測失敗纔會觸發單擊手勢的相應操作
  17. [singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
  18. [singleRecognizer release];
  19. [doubleRecognizer release];
  20. }
  21. -(void)SingleTap:(UITapGestureRecognizer*)recognizer
  22. {
  23. //處理單擊操作
  24. }
  25. -(void)DoubleTap:(UITapGestureRecognizer*)recognizer
  26. {
  27. //處理雙擊操作
  28. }

三、iphone操作手勢的大概種類

1.點擊(Tap)
點擊作爲最常用手勢,用於按下或選擇一個控件或條目(類似於普通的鼠標點擊)、

2.拖動(Drag)
拖動用於實現一些頁面的滾動,以及對控件的移動功能。

3.滑動(Flick)
滑動用於實現頁面的快速滾動和翻頁的功能。

4.橫掃(Swipe)
橫掃手勢用於激活列表項的快捷操作菜單

5.雙擊(Double Tap)
雙擊放大並居中顯示圖片,或恢復原大小(如果當前已經放大)。同時,雙擊能夠激活針對文字編輯菜單。

6.放大(Pinch open)
放大手勢可以實現以下功能:打開訂閱源,打開文章的詳情。在照片查看的時候,放大手勢也可實現放大圖片的功能。

7.縮小(Pinch close)
縮小手勢,可以實現與放大手勢相反且對應的功能的功能:關閉訂閱源退出到首頁,關閉文章退出至索引頁。在照片查看的時候,縮小手勢也可實現縮小圖片的功能。

8.長按(Touch &Hold)
在我的訂閱頁,長按訂閱源將自動進入編輯模式,同時選中手指當前按下的訂閱源。這時可直接拖動訂閱源移動位置。
針對文字長按,將出現放大鏡輔助功能。鬆開後,則出現編輯菜單。
針對圖片長按,將出現編輯菜單。

9.搖晃(Shake)
搖晃手勢,將出現撤銷與重做菜單。主要是針對用戶文本輸入的。

http://blog.csdn.net/likendsl/article/details/7554150

 

iOS-響應上下左右滑動手勢

-(void)viewDidLoad{

UISwipeGestureRecognizer *recognizer;

recognizer = [[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:@selector(handleSwipeFrom:)];

[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];

[[selfviewaddGestureRecognizer:recognizer];

[recognizerrelease];

recognizer = [[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:@selector(handleSwipeFrom:)];

[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];

[[selfviewaddGestureRecognizer:recognizer];

[recognizerrelease];

recognizer = [[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:@selector(handleSwipeFrom:)];

[recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];

[[selfviewaddGestureRecognizer:recognizer];

[recognizerrelease];

UISwipeGestureRecognizer *recognizer;

recognizer = [[UISwipeGestureRecognizeralloc]initWithTarget:selfaction:@selector(handleSwipeFrom:)];

[recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];

[[selfviewaddGestureRecognizer:recognizer];

[recognizerrelease];

}

-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer{

if(recognizer.direction==UISwipeGestureRecognizerDirectionDown) {

NSLog(@"swipe down");

//執行程序

}

if(recognizer.direction==UISwipeGestureRecognizerDirectionUp) {

NSLog(@"swipe up");

//執行程序

}

if(recognizer.direction==UISwipeGestureRecognizerDirectionLeft) {

NSLog(@"swipe left");

//執行程序

}

if(recognizer.direction==UISwipeGestureRecognizerDirectionRight) {

NSLog(@"swipe right");

//執行程序

}

}

http://blog.csdn.net/shijiucdy/article/details/7364143

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

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

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

viewController.h文件:

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController{
  3. IBOutlet UIImageView *imageView;
  4. }
  5. @property (nonatomic,retain)IBOutlet UIImageView *imageView;
  6. @end

並使xib文件裏的imageView與之連接;

然後是viewController.m文件的實現部分:

  1. @synthesize imageView;
  2. CGFloat lastScaleFactor=1;//放大、縮小
  3. CGFloat netRotation;//旋轉
  4. CGPoint netTranslation;//平衡
  5. NSArray *images;//圖片數組
  6. int imageIndex=0;//數組下標
  7. - (void)viewDidLoad
  8. {
  9. //1、創建手勢實例,並連接方法handleTapGesture,點擊手勢
  10. UITapGestureRecognizer *tapGesture=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTapGesture:)];
  11. //設置手勢點擊數,雙擊:點2下
  12. tapGesture.numberOfTapsRequired=2;
  13. // imageView添加手勢識別
  14. [imageView addGestureRecognizer:tapGesture];
  15. //釋放內存
  16. [tapGesture release];
  17. //2、手勢爲捏的姿勢:按住option按鈕配合鼠標來做這個動作在虛擬器上
  18. UIPinchGestureRecognizer *pinchGesture=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(handlePinchGesture:)];
  19. [imageView addGestureRecognizer:pinchGesture];//imageView添加手勢識別
  20. [pinchGesture release];
  21. //3、旋轉手勢:按住option按鈕配合鼠標來做這個動作在虛擬器上
  22. UIRotationGestureRecognizer *rotateGesture=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(handleRotateGesture:)];
  23. [imageView addGestureRecognizer:rotateGesture];
  24. [rotateGesture release];
  25. //4、拖手勢
  26. UIPanGestureRecognizer *panGesture=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handlePanGesture:)];
  27. // [imageView addGestureRecognizer:panGesture];
  28. [panGesture release];
  29. //5、划動手勢
  30. images=[[NSArray alloc]initWithObjects:@"cell.jpg",@"heihua.jpg",@"xuanyi.jpg", nil];
  31. //右劃
  32. UISwipeGestureRecognizer *swipeGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];
  33. [imageView addGestureRecognizer:swipeGesture];
  34. [swipeGesture release];
  35. //左劃
  36. UISwipeGestureRecognizer *swipeLeftGesture=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(handleSwipeGesture:)];
  37. swipeGesture.direction=UISwipeGestureRecognizerDirectionLeft;//不設置黑夜是右
  38. [imageView addGestureRecognizer:swipeLeftGesture];
  39. [swipeLeftGesture release];
  40. //6、長按手勢
  41. UILongPressGestureRecognizer *longpressGesutre=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(handleLongpressGesture:)];
  42. //長按時間爲1秒
  43. longpressGesutre.minimumPressDuration=1;
  44. //允許15秒中運動
  45. longpressGesutre.allowableMovement=15;
  46. //所需觸摸1次
  47. longpressGesutre.numberOfTouchesRequired=1;
  48. [imageView addGestureRecognizer:longpressGesutre];
  49. [longpressGesutre release];
  50. [super viewDidLoad];
  51. // Do any additional setup after loading the view, typically from a nib.
  52. }
  53. //雙擊屏幕時會調用此方法,放大和縮小圖片
  54. -(IBAction)handleTapGesture:(UIGestureRecognizer*)sender{
  55. //判斷imageView的內容模式是否是UIViewContentModeScaleAspectFit,該模式是原比例,按照圖片原時比例顯示大小
  56. if(sender.view.contentMode==UIViewContentModeScaleAspectFit){
  57. //把imageView模式改成UIViewContentModeCenter,按照圖片原先的大小顯示中心的一部分在imageView
  58. sender.view.contentMode=UIViewContentModeCenter;
  59. }else{
  60. sender.view.contentMode=UIViewContentModeScaleAspectFit;
  61. }
  62. }
  63. //捏的手勢,使圖片放大和縮小,捏的動作是一個連續的動作
  64. -(IBAction)handlePinchGesture:(UIGestureRecognizer*)sender{
  65. //得到sender捏手勢的大小
  66. CGFloat factor=[(UIPinchGestureRecognizer*)sender scale];
  67. if(factor>1){
  68. //圖片放大
  69. sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor+(factor-1), (lastScaleFactor+(factor-1)));
  70. }else{
  71. //縮小
  72. sender.view.transform=CGAffineTransformMakeScale(lastScaleFactor*factor, lastScaleFactor*factor);
  73. }
  74. //狀態是否結束,如果結束保存數據
  75. if(sender.state==UIGestureRecognizerStateEnded){
  76. if(factor>1){
  77. lastScaleFactor+=(factor-1);
  78. }else{
  79. lastScaleFactor*=factor;
  80. }
  81. }
  82. }
  83. //旋轉手勢
  84. -(IBAction)handleRotateGesture:(UIGestureRecognizer*)sender{
  85. //浮點類型,得到sender的旋轉度數
  86. CGFloat rotation=[(UIRotationGestureRecognizer*)sender rotation];
  87. //旋轉角度CGAffineTransformMakeRotation
  88. CGAffineTransform transform=CGAffineTransformMakeRotation(rotation+netRotation);
  89. //改變圖像角度
  90. sender.view.transform=transform;
  91. //狀態結束,保存數據
  92. if(sender.state==UIGestureRecognizerStateEnded){
  93. netRotation+=rotation;
  94. }
  95. }
  96. //拖手勢
  97. -(IBAction)handlePanGesture:(UIGestureRecognizer*)sender{
  98. //得到拖的過程中的xy座標
  99. CGPoint translation=[(UIPanGestureRecognizer*)sender translationInView:imageView];
  100. //平移圖片CGAffineTransformMakeTranslation
  101. sender.view.transform=CGAffineTransformMakeTranslation(netTranslation.x+translation.x, netTranslation.y+translation.y);
  102. //狀態結束,保存數據
  103. if(sender.state==UIGestureRecognizerStateEnded){
  104. netTranslation.x+=translation.x;
  105. netTranslation.y+=translation.y;
  106. }
  107. }
  108. //划動手勢
  109. -(IBAction)handleSwipeGesture:(UIGestureRecognizer*)sender{
  110. //划動的方向
  111. UISwipeGestureRecognizerDirection direction=[(UISwipeGestureRecognizer*) sender direction];
  112. //判斷是上下左右
  113. switch (direction) {
  114. case UISwipeGestureRecognizerDirectionUp:
  115. NSLog(@"up");
  116. break;
  117. case UISwipeGestureRecognizerDirectionDown:
  118. NSLog(@"down");
  119. break;
  120. case UISwipeGestureRecognizerDirectionLeft:
  121. NSLog(@"left");
  122. imageIndex++;//下標++
  123. break;
  124. case UISwipeGestureRecognizerDirectionRight:
  125. NSLog(@"right");
  126. imageIndex--;//下標--
  127. break;
  128. default:
  129. break;
  130. }
  131. //得到不越界不<0的下標
  132. imageIndex=(imageIndex<0)?([images count]-1):imageIndex%[images count];
  133. //imageView顯示圖片
  134. imageView.image=[UIImage imageNamed:[images objectAtIndex:imageIndex]];
  135. }
  136. //長按手勢
  137. -(IBAction)handleLongpressGesture:(UIGestureRecognizer*)sender{
  138. //創建警告
  139. UIActionSheet *actionSheet=[[UIActionSheet alloc]initWithTitle:@"Image options" delegate:self cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:@"Save Image",@"Copy", nil];
  140. //當前view顯示警告
  141. [actionSheet showInView:self.view];
  142. [actionSheet release];
  143. }
  144. -(void)dealloc{
  145. [images release];
  146. [imageView release];
  147. [super dealloc];
  148. }


嗯,試試效果吧!

來源:http://blog.csdn.net/rhljiayou/article/details/7553927

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章