一、概述
手勢是一種抽象,是對view操作的封裝與抽象。。。
處理觸摸的操作,在手勢出現之前通常是覆寫UIResponder的4個touch方法:
- (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基類
是一個抽象類,我們主要是使用它的子類(你可以點選檢視官方文檔):
-
UITapGestureRecognizer
-
UIPinchGestureRecognizer
-
UIRotationGestureRecognizer
-
UISwipeGestureRecognizer
-
UIPanGestureRecognizer
-
UILongPressGestureRecognizer
分别代表了這些手勢:
Tap(點選)、Pinch(捏合)、Rotation(旋轉)、Swipe(滑動,快速移動,是用于監測滑動的方向的)、Pan (拖移,慢速移動,是用于監測偏移的量的)以及 LongPress(長按)。
添加手勢,比如在viewDidLoad函數裡面添加:
UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
//給指定的view添加一個手勢監測;
[self.view addGestureRecognizer:panRecognizer];
//多指識别;
panRecognizer.maximumNumberOfTouches = 1;
//設定代理;
panRecognizer.delegate = self;
添加其它手勢的方法與此類似。
其核心就是設定delegate和在需要手勢監測的view上使用addGestureRecognizer添加指定的手勢監測。
不過有些手勢是關聯的,怎麼辦呢?例如 Tap 與 LongPress、Swipe與 Pan,或是 Tap 一次與Tap 兩次。
手勢識别是具有互斥的原則的,比如單擊和輕按兩下,如果它識别出一種手勢,其後的手勢将不被識别。是以對于關聯手勢,要做特殊處理以幫助程式甄别,應該把目前手勢歸結到哪一類手勢裡面。
比如,單擊和輕按兩下并存時,如果不做處理,它就隻能發送出單擊的消息。為了能夠識别出輕按兩下手勢,就需要做一個特殊處理邏輯,即先判斷手勢是否是輕按兩下,在輕按兩下失效的情況下作為單擊手勢處理。
使用下面的方法進行判斷:
[A requireGestureRecognizerToFail:B]
它可以指定當A手勢發生時,即便A已經滿足條件了,也不會立刻觸發,會等到指定的手勢B确定失敗之後才觸發。
// 單擊的 Recognizer
UITapGestureRecognizer* singleRecognizer;
singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(SingleTap:)];
//點選的次數
singleTapRecognizer.numberOfTapsRequired = 1;
singleRecognizer.delegate = self;
//給self.view添加一個手勢監測;
[self.view addGestureRecognizer:singleRecognizer];
[singleRecognizer release];
// 輕按兩下的 Recognizer
UITapGestureRecognizer* double;
doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(DoubleTap:)];
doubleTapRecognizer.numberOfTapsRequired = 2; // 輕按兩下
//關鍵語句,給self.view添加一個手勢監測;
[self.view addGestureRecognizer:doubleRecognizer];
singleRecognizer.delegate = self;
// 輕按兩下手勢确定監測失敗才會觸發單擊手勢的相應操作
[singleRecognizer requireGestureRecognizerToFail:doubleRecognizer];
[doubleRecognizer release];
三、iphone操作手勢的大概種類
1.點選(Tap)
點選作為最常用手勢,用于按下或選擇一個控件或條目(類似于普通的滑鼠點選)、
2.拖動(Drag)
拖動用于實作一些頁面的滾動,以及對控件的移動功能。
3.滑動(Flick)
滑動用于實作頁面的快速滾動和翻頁的功能。
4.橫掃(Swipe)
橫掃手勢用于激活清單項的快捷操作菜單
5.輕按兩下(Double Tap)
輕按兩下放大并居中顯示圖檔,或恢複原大小(如果目前已經放大)。同時,輕按兩下能夠激活針對文字編輯菜單。
6.放大(Pinch open)
放大手勢可以實作以下功能:打開訂閱源,打開文章的詳情。在照片檢視的時候,放大手勢也可實作放大圖檔的功能。
7.縮小(Pinch close)
縮小手勢,可以實作與放大手勢相反且對應的功能的功能:關閉訂閱源退出到首頁,關閉文章退出至索引頁。在照片檢視的時候,縮小手勢也可實作縮小圖檔的功能。
8.長按(Touch &Hold)
在我的訂閱頁,長按訂閱源将自動進入編輯模式,同時選中手指目前按下的訂閱源。這時可直接拖動訂閱源移動位置。
針對文字長按,将出現放大鏡輔助功能。松開後,則出現編輯菜單。
針對圖檔長按,将出現編輯菜單。
9.搖晃(Shake)
搖晃手勢,将出現撤銷與重做菜單。主要是針對使用者文本輸入的。