最近在項目中用到了手勢操作,鍵盤回收時還是挺常用的,現在總結下,多謝網絡上大神們的分享。
先分享下我在項目中用的代碼:
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屬性。
對於其他手勢例如UISwipeGestureRecognizer,UILongPressGestureRecognizer,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
[代碼] 一個手指,拍擊兩次手勢
02 |
UITapGestureRecognizer *oneFingerTwoTaps = |
03 |
[[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(oneFingerTwoTaps)] autorelease]; |
06 |
[oneFingerTwoTaps setNumberOfTapsRequired:2]; |
07 |
[oneFingerTwoTaps setNumberOfTouchesRequired:1]; |
10 |
[[self view] addGestureRecognizer:oneFingerTwoTaps]; |
13 |
- ( void )oneFingerTwoTaps |
15 |
NSLog(@ "Action: One finger, two taps" ); |
[代碼] 兩個手指,拍擊兩次手勢
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]; |
08 |
- ( void )twoFingersTwoTaps { |
09 |
NSLog(@ "Action: Two fingers, two taps" ); |
[代碼] 一個手指向上、向下擦碰手勢
02 |
UISwipeGestureRecognizer *oneFingerSwipeUp = |
03 |
[[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(oneFingerSwipeUp:)] autorelease]; |
04 |
[oneFingerSwipeUp setDirection:UISwipeGestureRecognizerDirectionUp]; |
05 |
[[self view] addGestureRecognizer:oneFingerSwipeUp]; |
07 |
- ( void )oneFingerSwipeUp:(UISwipeGestureRecognizer *)recognizer |
09 |
CGPoint point = [recognizer locationInView:[self view]]; |
10 |
NSLog(@ "Swipe up - start location: %f,%f" , point.x, point.y); |
14 |
UISwipeGestureRecognizer *oneFingerSwipeDown = |
15 |
[[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(oneFingerSwipeDown:)] autorelease]; |
16 |
[oneFingerSwipeDown setDirection:UISwipeGestureRecognizerDirectionDown]; |
17 |
[[self view] addGestureRecognizer:oneFingerSwipeDown]; |
19 |
- ( void )oneFingerSwipeDown:(UISwipeGestureRecognizer *)recognizer |
21 |
CGPoint point = [recognizer locationInView:[self view]]; |
22 |
NSLog(@ "Swipe down - start location: %f,%f" , point.x, point.y); |
[代碼] 旋轉手勢
1 |
UIRotationGestureRecognizer *twoFingersRotate = |
2 |
[[[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingersRotate:)] autorelease]; |
3 |
[[self view] addGestureRecognizer:twoFingersRotate]; |
5 |
- ( void )twoFingersRotate:(UIRotationGestureRecognizer *)recognizer |
8 |
NSLog(@ "Rotation in degrees since last change: %f" , [recognizer rotation] * (180 / M_PI)); |
[代碼] 向里或向外捏的手勢
1 |
UIPinchGestureRecognizer *twoFingerPinch = |
2 |
[[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(twoFingerPinch:)] autorelease]; |
3 |
[[self view] addGestureRecognizer:twoFingerPinch]; |
5 |
- ( void )twoFingerPinch:(UIPinchGestureRecognizer *)recognizer |
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