理解UITouch,UIEvent,UIGestureRecognizer以及UIResponder
-
UITouch:一個(gè)觸摸對(duì)象代表一根手指對(duì)屏幕的接觸以及在屏幕上的移動(dòng)。其生命周期從手指接觸屏幕開始,到手指離開屏幕為止。 -
手勢(shì):一個(gè)手勢(shì)需要一根或多根手指完成,即一個(gè)手勢(shì)包含一個(gè)或多個(gè)UITouch對(duì)象。 -
觸摸序列:用于描述手勢(shì)發(fā)生時(shí)(多個(gè))手指接觸屏幕的過程。整個(gè)過程從構(gòu)成手勢(shì)的第一根手指接觸屏幕開始,到手勢(shì)進(jìn)行完畢時(shí)的最后一個(gè)手指離開屏幕為止。 -
UIEvent:代表iOS系統(tǒng)同外界互動(dòng)時(shí)所發(fā)生的事件。有三種:觸摸事件,動(dòng)作事件,遠(yuǎn)程控制事件。對(duì)于觸摸事件,UIEvent中保存著同當(dāng)前觸摸序列相關(guān)的UITouch對(duì)象。 -
UIGestureRecognizer:用于識(shí)別特定手勢(shì)。 -
UIResponder:可以響應(yīng)事件,動(dòng)作消息等。多個(gè)響應(yīng)對(duì)象組成響應(yīng)鏈,從而形成完整的事件/消息響應(yīng)體系。
UITouch
- UITouch是UIKit中處理用戶觸屏交互的底層對(duì)象。
- 每個(gè)UITouch都對(duì)應(yīng)一個(gè)當(dāng)前接觸屏幕的手指。
- 如果手指移動(dòng),系統(tǒng)會(huì)不斷更新UITouch的屬性,例如
previousLocationInView:和locationInView:。 - 在手勢(shì)發(fā)生的過程中(觸摸序列中),UITouch對(duì)象會(huì)被創(chuàng)建,被銷毀,還會(huì)改變狀態(tài)。例如,兩個(gè)手指先后接觸屏幕,而后又先后離開屏幕,在這個(gè)過程中,UITouch對(duì)象的數(shù)量會(huì)呈現(xiàn)
1 --> 2 --> 1。
UIEvent
- UIEvent用來代表觸摸事件,可以將多個(gè)同時(shí)或近似時(shí)間發(fā)生的手指對(duì)屏幕的接觸(
UITouch)描述為一個(gè)整體,解讀為一個(gè)特定的手勢(shì)或動(dòng)作。 - UIEvent對(duì)象的生命周期也只維持在手勢(shì)發(fā)生(觸摸序列)期間,不要試圖retain
UIEvent或UITouch對(duì)象,如果需要記錄它們的信息,應(yīng)該復(fù)制這些信息。
UIGestureRecognizer
將其添加至視圖,可以將觸摸事件識(shí)別為特定的手勢(shì),如果識(shí)別成功,則調(diào)用關(guān)聯(lián)的動(dòng)作方法。在iOS中,一共有六種標(biāo)準(zhǔn)手勢(shì):
- 點(diǎn)擊
- 捏合
- 拖拽
- 滑動(dòng)
- 旋轉(zhuǎn)
- 長(zhǎng)按
當(dāng)然也可以自定義手勢(shì)。
UIResponder
讓視圖/控制器直接處理觸摸事件,通過判定比較UITouch對(duì)象的前后狀態(tài),直接實(shí)現(xiàn)邏輯功能,例如繪畫,拖動(dòng)屏幕控件等。
處理觸摸事件的四個(gè)方法
不論是UIGestureRecognizer還是UIResponder,都利用這四個(gè)方法處理觸摸事件。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; // 處理開始階段的UITouch對(duì)象
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; // 處理移動(dòng)階段的UITouch對(duì)象
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; // 處理結(jié)束階段的UITouch對(duì)象
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; // 處理取消階段的UITouch對(duì)象
多點(diǎn)觸摸
- 涉及多個(gè)
UITouch對(duì)象,需要比較它們前后的狀態(tài),可以使用CFDictionaryRef,將對(duì)象的地址作為鍵,狀態(tài)(值)地址作為值,存入字典。