一、概述
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函數裏面添加:
- -(void) viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view from its nib.
- UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
- [self.view addGestureRecognizer:panRecognizer];//關鍵語句,給self.view添加一個手勢監測;
- panRecognizer.maximumNumberOfTouches = 1;
- panRecognizer.delegate = self;
- [panRecognizer release];
- }
其核心就是設置delegate和在需要手勢監測的view上使用addGestureRecognizer添加指定的手勢監測。
當然要記得在作爲delegate的view的頭文件加上<UIGestureRecognizerDelegate>。
不過有些手勢是關聯的,怎麼辦呢?例如 Tap 與 LongPress、Swipe與 Pan,或是 Tap 一次與Tap 兩次。
手勢識別是具有互斥的原則的,比如單擊和雙擊,如果它識別出一種手勢,其後的手勢將不被識別。所以對於關聯手勢,要做特殊處理以幫助程序甄別,應該把當前手勢歸結到哪一類手勢裏面。
比如,單擊和雙擊並存時,如果不做處理,它就只能發送出單擊的消息。爲了能夠識別出雙擊手勢,就需要做一個特殊處理邏輯,即先判斷手勢是否是雙擊,在雙擊失效的情況下作爲單擊手勢處理。使用
[A requireGestureRecognizerToFail:B]函數,它可以指定當A手勢發生時,即便A已經滿足條件了,也不會立刻觸發,會等到指定的手勢B確定失敗之後才觸發。
- - (void)viewDidLoad
- {
- // 單擊的 Recognizer
- UITapGestureRecognizer* singleRecognizer;
- singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(SingleTap:)];
- //點擊的次數
- singleTapRecognizer.numberOfTapsRequired = 1; // 單擊
- //給self.view添加一個手勢監測;
- [self.view addGestureRecognizer:singleRecognizer];
- // 雙擊的 Recognizer
- UITapGestureRecognizer* double;
- doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(DoubleTap:)];
- doubleTapRecognizer.numberOfTapsRequired = 2; // 雙擊
- //關鍵語句,給self.view添加一個手勢監測;
- [self.view addGestureRecognizer:doubleRecognizer];
- // 關鍵在這一行,雙擊手勢確定監測失敗纔會觸發單擊手勢的相應操作
- [singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
- [singleRecognizer release];
- [doubleRecognizer release];
- }
- -(void)SingleTap:(UITapGestureRecognizer*)recognizer
- {
- //處理單擊操作
- }
- -(void)DoubleTap:(UITapGestureRecognizer*)recognizer
- {
- //處理雙擊操作
- }
三、iphone操作手勢的大概種類
1.點擊(Tap)
點擊作爲最常用手勢,用於按下或選擇一個控件或條目(類似於普通的鼠標點擊)、
2.拖動(Drag)
拖動用於實現一些頁面的滾動,以及對控件的移動功能。
3.滑動(Flick)
滑動用於實現頁面的快速滾動和翻頁的功能。
4.橫掃(Swipe)
橫掃手勢用於激活列表項的快捷操作菜單
5.雙擊(Double Tap)
雙擊放大並居中顯示圖片,或恢復原大小(如果當前已經放大)。同時,雙擊能夠激活針對文字編輯菜單。
6.放大(Pinch open)
放大手勢可以實現以下功能:打開訂閱源,打開文章的詳情。在照片查看的時候,放大手勢也可實現放大圖片的功能。
7.縮小(Pinch close)
縮小手勢,可以實現與放大手勢相反且對應的功能的功能:關閉訂閱源退出到首頁,關閉文章退出至索引頁。在照片查看的時候,縮小手勢也可實現縮小圖片的功能。
8.長按(Touch &Hold)
在我的訂閱頁,長按訂閱源將自動進入編輯模式,同時選中手指當前按下的訂閱源。這時可直接拖動訂閱源移動位置。
針對文字長按,將出現放大鏡輔助功能。鬆開後,則出現編輯菜單。
針對圖片長按,將出現編輯菜單。
9.搖晃(Shake)
搖晃手勢,將出現撤銷與重做菜單。主要是針對用戶文本輸入的。