天天看點

iOS開發之手勢識别器

一、概述

手勢是一種抽象,是對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)

搖晃手勢,将出現撤銷與重做菜單。主要是針對使用者文本輸入的。

繼續閱讀