UITapGestureRecognizer 的用法


 

最近在項目中用到了手勢操作,鍵盤回收時還是挺常用的,現在總結下,多謝網絡上大神們的分享。

先分享下我在項目中用的代碼:

 1 UITapGestureRecognizer * mytap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap_gestureRecognizer:)];
 2     [self addGestureRecognizer:mytap];
 3     [mytap release];
 4 
 5 
 6 //收回鍵盤
 7 -(void)tap_gestureRecognizer:(UITapGestureRecognizer *)tap_gest
 8 {
 9     [self.scv_stockPriceTextField resignFirstResponder];
10     [self.scv_stockAmoutTextField resignFirstResponder];
11 
12 }

 

 
        

//單指單擊
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的操作使用類似處理。

 


 

UIKit中包含了UIGestureRecognizer類,用於檢測發生在設備中的手勢。UIGestureRecognizer是一個抽象類,定義了所有手勢的基本行為,它有下面一些子類用於處理具體的手勢: 

    1、拍擊UITapGestureRecognizer (任意次數的拍擊)  
    2、向里或向外捏UIPinchGestureRecognizer (用於縮放)  
    3、搖動或者拖拽UIPanGestureRecognizer  
    4、擦碰UISwipeGestureRecognizer (以任意方向)  
    5、旋轉UIRotationGestureRecognizer (手指朝相反方向移動)  
    6、長按UILongPressGestureRecognizer 

對於不同類型的手勢識別器,具有不同的配置屬性。比如UITapGestureRecognizer,可以配置拍擊次數。界面接收到手勢之后,可以發送一 個消息,用於處理響應手勢動作后的任務。當然,不同的手勢識別器,發送的消息方法也會有所不同。下面列舉幾個具體示例代碼: 
http://www.ctolive.com/space-1023-do-blog-id-2107.html 
 
標簽: Objective-C iOS
 

代碼片段(5)

[代碼] 一個手指,拍擊兩次手勢

01 // 創建一個手勢識別器
02 UITapGestureRecognizer *oneFingerTwoTaps =
03   [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneFingerTwoTaps)] autorelease];
04   
05 // Set required taps and number of touches
06 [oneFingerTwoTaps setNumberOfTapsRequired:2];
07 [oneFingerTwoTaps setNumberOfTouchesRequired:1];
08   
09 // Add the gesture to the view
10 [[self view] addGestureRecognizer:oneFingerTwoTaps];
11
12 消息方法oneFingerTwoTaps
13 - (void)oneFingerTwoTaps
14 {
15   NSLog(@"Action: One finger, two taps");
16 }

[代碼] 兩個手指,拍擊兩次手勢

01 UITapGestureRecognizer *twoFingersTwoTaps =
02   [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingersTwoTaps)] autorelease];
03 [twoFingersTwoTaps setNumberOfTapsRequired:2];
04 [twoFingersTwoTaps setNumberOfTouchesRequired:2];
05 [[self view] addGestureRecognizer:twoFingersTwoTaps];
06
07 消息方法twoFingersTwoTaps
08 - (void)twoFingersTwoTaps {
09   NSLog(@"Action: Two fingers, two taps");
10 }

[代碼] 一個手指向上、向下擦碰手勢

01 // 向上擦碰
02 UISwipeGestureRecognizer *oneFingerSwipeUp =
03   [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(oneFingerSwipeUp:)] autorelease];
04 [oneFingerSwipeUp setDirection:UISwipeGestureRecognizerDirectionUp];
05 [[self view] addGestureRecognizer:oneFingerSwipeUp];
06
07 - (void)oneFingerSwipeUp:(UISwipeGestureRecognizer *)recognizer
08 {
09   CGPoint point = [recognizer locationInView:[self view]];
10   NSLog(@"Swipe up - start location: %f,%f", point.x, point.y);
11 }
12
13 // 向下擦碰
14 UISwipeGestureRecognizer *oneFingerSwipeDown =
15   [[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(oneFingerSwipeDown:)] autorelease];
16 [oneFingerSwipeDown setDirection:UISwipeGestureRecognizerDirectionDown];
17 [[self view] addGestureRecognizer:oneFingerSwipeDown];
18
19 - (void)oneFingerSwipeDown:(UISwipeGestureRecognizer *)recognizer
20 {
21   CGPoint point = [recognizer locationInView:[self view]];
22   NSLog(@"Swipe down - start location: %f,%f", point.x, point.y);
23 }

[代碼] 旋轉手勢

1 UIRotationGestureRecognizer *twoFingersRotate =
2   [[[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingersRotate:)] autorelease];
3 [[self view] addGestureRecognizer:twoFingersRotate];
4
5 - (void)twoFingersRotate:(UIRotationGestureRecognizer *)recognizer
6 {
7   // Convert the radian value to show the degree of rotation
8   NSLog(@"Rotation in degrees since last change: %f", [recognizer rotation] * (180 / M_PI));
9 }

[代碼] 向里或向外捏的手勢

1 UIPinchGestureRecognizer *twoFingerPinch =
2   [[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPinch:)] autorelease];
3 [[self view] addGestureRecognizer:twoFingerPinch];
4
5 - (void)twoFingerPinch:(UIPinchGestureRecognizer *)recognizer
6 {
7

  NSLog(@"Pinch scale: %f", recognizer.scale);

}


在 iPhone 或 iPad 的開發中,除了用 touchesBegan / touchesMoved / touchesEnded 這組方法來控制使用者的手指觸控外,也可以用 UIGestureRecognizer 的衍生類別來進行判斷。用 UIGestureRecognizer 的好處在於有現成的手勢,開發者不用自己計算手指移動軌跡。UIGestureRecognizer的衍生類別有以下幾種:

  • UITapGestureRecognizer
  • UIPinchGestureRecognizer
  • UIRotationGestureRecognizer
  • UISwipeGestureRecognizer
  • UIPanGestureRecognizer
  • UILongPressGestureRecognizer

從命名上不難了解這些類別所對應代表的手勢,分別是 Tap(點一下)、Pinch(二指往內或往外撥動)、Rotation(旋轉)、Swipe(滑動,快速移動)、Pan (拖移,慢速移動)以及 LongPress(長按)。這些手勢別在使用上也很簡單,只要在使用前定義並添加到對應的視圖上即可。

復制代碼
// 定義一個 recognizer, 並加到需要偵測該手勢的 UIView 元件上
- (void)viewDidLoad {
UISwipeGestureRecognizer* recognizer;
// handleSwipeFrom 是偵測到手勢,所要呼叫的方法
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSwipeFrom)];
// 不同的 Recognizer 有不同的實體變數
// 例如 SwipeGesture 可以指定方向
// 而 TapGesture 則可以指定次數
recognizer.direction = UISwipeGestureRecognizerDirectionUp
[self.view addGestureRecognizer:recognizer];
[recognizer release];
}

- (void)handleSwipeFrom:(UISwipeGestureRecognizer*)recognizer {
// 觸發手勢事件后,在這里作些事情

// 底下是刪除手勢的方法
[self.view removeGestureRecognizer:recognizer];
}
復制代碼
問題來了。有些手勢其實是互相關聯的,例如 Tap 與 LongPress、Swipe與 Pan,或是 Tap 一次與Tap 兩次。當一個 UIView 同時添加兩個相關聯的手勢時,到底我這一下手指頭按的要算是 Tap 還是 LongPress?如果照預設作法來看,只要「先滿足條件」的就會跳出並呼叫對應方法,舉例來說,如果同時注冊了 Pan 和 Swipe,只要手指頭一移動就會觸發 Pan 然后跳出,因而永遠都不會發生 Swipe;單點與雙點的情形也是一樣,永遠都只會觸發單點,不會有雙點。

那么這個問題有解嗎?答案是肯定的,UIGestureRecognizer 有個方法叫做requireGestureRecognizerToFail,他可以指定某一個 recognizer,即便自己已經滿足條件了,也不會立刻觸發,會等到該指定的 recognizer 確定失敗之后才觸發。以同時支持單點與雙點的手勢為例,代碼如下:

復制代碼
- (void)viewDidLoad {
// 單擊的 Recognizer
UITapGestureRecognizer* singleRecognizer;
singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleSingleTapFrom)];
singleTapRecognizer.numberOfTapsRequired = 1; // 單擊
[self.view addGestureRecognizer:singleRecognizer];

// 雙擊的 Recognizer
UITapGestureRecognizer* double;
doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(handleDoubleTapFrom)];
doubleTapRecognizer.numberOfTapsRequired = 2; // 雙擊
[self.view addGestureRecognizer:doubleRecognizer];

// 關鍵在這一行,如果雙擊確定偵測失敗才會觸發單擊
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
[singleRecognizer release];
[doubleRecognizer release];
}
 

來源:http://blog.csdn.net/xiaoxuan415315/article/details/7788239


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM