IOS事件傳遞

在用戶使用app的過程中 會(huì)產(chǎn)生各種各樣的事件 大致可以分為3個(gè)類型

1,觸摸事件//如 點(diǎn)擊屏幕 拖拽....

2,加速計(jì)事件//如 搖一搖

3,遠(yuǎn)程控制事件//如 遙控器遠(yuǎn)程操作

在IOS中 不是任何對(duì)象都能處理事件的 ?只有繼承了 UIResponder的對(duì)象 才能接受并處理事件

UIApplication,UIViewController,UIView 都是繼承自 UIResponder 因此它們都是響應(yīng)者對(duì)象 ?都能夠接受并處理事件

無(wú)法進(jìn)行交互的情況

控件的透明度 在 0~0.01之間是無(wú)法接受交互的

控件的userInteractionEnable = NO 是無(wú)法進(jìn)行交互的

控件超出父控件的部分是無(wú)法接收交互的 ?即使設(shè)置clipToBounds=YES 能看見 也無(wú)法進(jìn)行交互

控件的hidden = YES 是無(wú)法進(jìn)行交互的

事件傳遞: ?就是當(dāng)產(chǎn)生交互事件時(shí) ?查到到最適合處理事件的對(duì)象

1, ?當(dāng)事件產(chǎn)生時(shí) ?主循環(huán)捕獲事件 ? 接下來(lái)進(jìn)行查找 尋找最適合處理事件的對(duì)象(即第一響應(yīng)者)

2,查找順序: ?UIApplication?—> UIWindow?—> rootViewController?—> UIView

在UIView中 會(huì)遍歷 它的子View 查看其是否適合 處理事件

在遍歷的時(shí)候 是按照該其 子View數(shù)組的 倒序來(lái)進(jìn)行遍歷//也就是從 顯示在最上面的開始遍歷

觸摸事件實(shí)際查找時(shí)會(huì)調(diào)用下面的方法

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event;

//判斷該觸摸事件的 觸摸坐標(biāo) 是否在當(dāng)前的View上 ? 若在 則返回YES

-(UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event;

// 當(dāng)事件產(chǎn)生 時(shí) 會(huì)調(diào)用該方法

hitTest: withEvent: 方法內(nèi)部邏輯參考

請(qǐng)多多指正

hitTest: withEvent: 方法的活用

當(dāng) 我們不希望 第一響應(yīng)者 和 觸摸對(duì)象 一一對(duì)應(yīng)時(shí)//如 希望一個(gè)view的超出 父view的部分 可以響應(yīng)觸摸

則可以在 其父view的父view中 重寫hitTest方法 當(dāng)觸摸點(diǎn)在某個(gè)范圍時(shí) 則返回該view作為第一響應(yīng)者

//注意 在實(shí)現(xiàn)時(shí) 注意要選用統(tǒng)一的坐標(biāo)系

響應(yīng)者鏈條

若 事件傳遞完成 ?則找到了最佳的事件處理對(duì)象 ——> 成為 第一響應(yīng)者

當(dāng)?shù)谝豁憫?yīng)者 無(wú)法響應(yīng)事件 ?則會(huì)交給下一響應(yīng)者(nextResponder)來(lái)處理 若其無(wú)法處理 會(huì)在下一個(gè)NextResponder中尋找

若知道UIApplication時(shí) 都無(wú)法響應(yīng) 則丟棄該事件

view 的nextResponder的選擇: ?若有控制器 管理該控件 則nextResponder為其控制器 ——>父View

若無(wú)控制器 管理該對(duì)象 則nextResponder 為其父View

其他的nextResponder選擇

RootViewController?—> UIWindow?—> UIApplication?—> nil

在響應(yīng)鏈 中 無(wú)論這個(gè)第一響應(yīng)者 是否對(duì)這個(gè)事件 進(jìn)行了處理 都會(huì)響應(yīng)到 UIApplication ?如果想要中斷響應(yīng)鏈 ?則在 重寫的Touch方法中 不調(diào)用其父類方法


簡(jiǎn)書用的不熟練 排版有些難看 歡迎大家多多指正 共同學(xué)習(xí)

最后編輯于
?著作權(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)容

  • 本次筆記主要是整理一下關(guān)于 iOS 中關(guān)于事件傳遞和響應(yīng)機(jī)制,參考了一些其他資料加上自己的理解。 事件 Event...
    varlarzh閱讀 377評(píng)論 0 2
  • 本篇主要講解iOS事件傳遞的整個(gè)過程,大部分內(nèi)容翻譯自Apple Developer Guide,原文鏈接 當(dāng)一個(gè)...
    Little_Mango閱讀 1,355評(píng)論 4 10
  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點(diǎn)擊了?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 59,488評(píng)論 51 604
  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件。本想自己總結(jié)一下,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載。作者:L...
    WQ_UESTC閱讀 6,246評(píng)論 4 26
  • 用戶以多種方式操縱他們的iOS設(shè)備,例如觸摸屏幕或搖動(dòng)設(shè)備。 iOS會(huì)解釋用戶何時(shí)以及如何操作硬件并將此信息傳遞到...
    坤坤同學(xué)閱讀 4,120評(píng)論 7 19

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