理解UITouch,UIEvent,UIGestureRecognizer以及UIResponder

理解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 UIEventUITouch對(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)(值)地址作為值,存入字典。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件。本想自己總結(jié)一下,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載。作者:L...
    WQ_UESTC閱讀 6,246評(píng)論 4 26
  • -- iOS事件全面解析 概覽 iPhone的成功很大一部分得益于它多點(diǎn)觸摸的強(qiáng)大功能,喬布斯讓人們認(rèn)識(shí)到手機(jī)其實(shí)...
    翹楚iOS9閱讀 3,206評(píng)論 0 13
  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點(diǎn)擊了?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 59,488評(píng)論 51 604
  • 響應(yīng)者對(duì)象 在iOS中不是任何對(duì)象都能處理事件,只有繼承了UIResponder的對(duì)象才能接收并處理事件。我們稱之...
    JonesCxy閱讀 805評(píng)論 0 0
  • iOS中的事件可以分為三大類: 1> 觸摸事件 2> 加速計(jì)事件 3> 遠(yuǎn)程控制事件 響應(yīng)者對(duì)象 在iOS中不是任...
    腦子勺掉了吧你閱讀 1,498評(píng)論 1 0

友情鏈接更多精彩內(nèi)容