手勢(shì)識(shí)別器(Gesture Recognizers)
手勢(shì)識(shí)別器將低級(jí)別的事件處理代碼轉(zhuǎn)換成高級(jí)別的動(dòng)作。它們是你綁定到視圖上的對(duì)象,這些對(duì)象允許視圖對(duì)動(dòng)作進(jìn)行響應(yīng),就像控件一樣。手勢(shì)識(shí)別器把觸摸解析成一個(gè)確定的手勢(shì),例如輕拂(swip),捏合(pinch),或者旋轉(zhuǎn)。如果它們識(shí)別出了被分配手勢(shì),會(huì)發(fā)送一條動(dòng)作消息給一個(gè)目標(biāo)對(duì)象。目標(biāo)對(duì)象很典型是視圖的視圖控制器,視圖控制器像圖1-1展示的那樣對(duì)手勢(shì)進(jìn)行響應(yīng)。這種設(shè)計(jì)模式簡(jiǎn)單而又強(qiáng)大;你能夠動(dòng)態(tài)的決定一個(gè)視圖要響應(yīng)哪個(gè)動(dòng)作,并且你能夠給一個(gè)視圖加上手勢(shì)識(shí)別器而不用創(chuàng)建視圖的子類。

手勢(shì)識(shí)別器綁定視圖
使用手勢(shì)識(shí)別器來(lái)簡(jiǎn)化事件處理
UIKit framework提供了能檢測(cè)到常見(jiàn)手勢(shì)的預(yù)定義手勢(shì)識(shí)別器。如果可能,使用預(yù)定義的手勢(shì)識(shí)別器是最好的方式,因?yàn)轭A(yù)定義手勢(shì)識(shí)別器的簡(jiǎn)單減少了你需要寫(xiě)的代碼數(shù)量。并且,使用一個(gè)標(biāo)準(zhǔn)的手勢(shì)識(shí)別器來(lái)代替你自己定義,能保證你的應(yīng)用的行為符合用戶的預(yù)期。
如果想讓你的應(yīng)用識(shí)別一個(gè)獨(dú)特的手勢(shì),比如打個(gè)對(duì)號(hào)或者一個(gè)旋轉(zhuǎn)手勢(shì),你可以創(chuàng)建自定義的手勢(shì)識(shí)別器。想要學(xué)習(xí)如何設(shè)計(jì)和完成你自己的手勢(shì)識(shí)別器,請(qǐng)參見(jiàn)Creating a Custom Gesture Recognizer。
內(nèi)建的手勢(shì)識(shí)別器識(shí)別常見(jiàn)的手勢(shì)
在你設(shè)計(jì)應(yīng)用的時(shí)候,你需要考慮你想識(shí)別哪些手勢(shì)。然后,對(duì)于每一個(gè)手勢(shì),你需要決定下表1-1中的預(yù)定義手勢(shì)識(shí)別器哪一個(gè)夠用。
手勢(shì)UIKit 類Tapping (any number of taps)UITapGestureRecognizerPinching in and out (for zooming a view)UIPinchGestureRecognizerPanning or draggingUIPanGestureRecognizerSwiping (in any direction)UISwipeGestureRecognizerRotating (fingers moving in opposite directions)UIRotationGestureRecognizerLong press (also known as “touch and hold”)UILongPressGestureRecognizer你的應(yīng)用應(yīng)該只以用戶期望的方式對(duì)手勢(shì)進(jìn)行反饋。例如,一個(gè)pinch應(yīng)該放大縮小,一個(gè)點(diǎn)擊應(yīng)該選擇某樣?xùn)|西。For guidelines about how to properly use gestures, see Apps Respond to Gestures, Not Clicks.
手勢(shì)識(shí)別器與視圖綁定
每個(gè)手勢(shì)識(shí)別器都是和一個(gè)視圖聯(lián)系起來(lái)的。相比之下,一個(gè)的視圖能擁有多個(gè)視圖控制器,因?yàn)橐粋€(gè)獨(dú)立的視圖能響應(yīng)多個(gè)手勢(shì)識(shí)別器。如果你想要一個(gè)手勢(shì)識(shí)別器識(shí)別發(fā)生在一個(gè)特定視圖上的觸摸,你得把這個(gè)手勢(shì)識(shí)別器綁定到這個(gè)視圖上去。當(dāng)用戶觸摸到這個(gè)視圖時(shí),手勢(shì)識(shí)別器將早于視圖對(duì)象收到一條觸摸發(fā)生的消息。因此,這個(gè)手勢(shì)識(shí)別器能夠代表視圖對(duì)觸摸進(jìn)行響應(yīng)。
手勢(shì)觸發(fā)動(dòng)作消息
當(dāng)一個(gè)手勢(shì)識(shí)別器識(shí)別出了一個(gè)特殊手勢(shì),它將發(fā)送一條動(dòng)作消息給它的目標(biāo)。要?jiǎng)?chuàng)建一個(gè)手勢(shì)識(shí)別器,你得對(duì)它進(jìn)行初始化,設(shè)置一個(gè)目標(biāo)(target)和一個(gè)動(dòng)作(action)。
離散和連續(xù)的手勢(shì)
手勢(shì)不是離散的就是連續(xù)的。一個(gè)離散的手勢(shì),例如點(diǎn)擊(tap),發(fā)生一次。一個(gè)連續(xù)的手勢(shì),例如捏合(pinching),發(fā)生在一個(gè)時(shí)間段內(nèi)。對(duì)于離散的手勢(shì),一個(gè)手勢(shì)識(shí)別器發(fā)送給它的目標(biāo)一個(gè)獨(dú)立的動(dòng)作消息。而連續(xù)手勢(shì)的手勢(shì)識(shí)別器會(huì)持續(xù)發(fā)送給目標(biāo)動(dòng)作消息,直到觸摸序列停止,如圖1-2所示。

離散和連續(xù)的手勢(shì)
使用手勢(shì)識(shí)別器對(duì)事件響應(yīng)
為你的應(yīng)用添加一個(gè)內(nèi)建的手勢(shì)識(shí)別器需要做三件事:
創(chuàng)建并配置一個(gè)手勢(shì)識(shí)別器實(shí)例;
這一步包括指定一個(gè)目標(biāo),動(dòng)作,和手勢(shì)的一些特殊屬性(如點(diǎn)擊次數(shù));
把這個(gè)手勢(shì)識(shí)別器綁定到視圖上;
完成處理這個(gè)手勢(shì)的動(dòng)作方法(action method)。
使用界面構(gòu)建器(IB)添加手勢(shì)識(shí)別器