iOS使用hit-testing,事件響應(yīng)者鏈的工作原理

iOS使用hit-testing尋找觸摸的view。 Hit-Testing通過檢查觸摸點(diǎn)是否在關(guān)聯(lián)的view邊界內(nèi),如果在,則遞歸地檢查該view的所有子view。在層級(jí)上處于lowest(就是離用戶最近的view)且邊界范圍包含觸摸點(diǎn)的view成為hit-test view。確定hit-test view后,它傳遞觸摸事件給該view。

官方小例子事件響應(yīng)者鏈如下圖所示:

386B3F93-2F8B-4848-956C-0152E797B5F1.png
  • 觸摸點(diǎn)在view A中,所以要先檢查子view B和C。
  • 觸摸點(diǎn)不在view B中,但在C中,所以檢查C的子view D和E。
  • 觸摸點(diǎn)不在D中,但在E中。View E是這個(gè)層級(jí)上處于lowest的- view的邊界范圍包含觸摸點(diǎn),所以它成為了hit-test view。
    Hit-test view是處理觸摸事件的第一選擇,如果hit-test view不能處理事件,該事件將從事件響應(yīng)鏈中尋找響應(yīng)器,直到系統(tǒng)找到一個(gè)處理事件的對(duì)象。若不能處理,則就有事件傳遞鏈了,繼續(xù)看下面的事件傳遞鏈。

事件傳遞鏈如下圖所示:

iOS_responder_chain.png
左半圖:

initial view若不能處理事件,則傳到其父視圖view
view若不能處理,則傳到其父視圖,因?yàn)樗€不是最上層視圖
這里view的父視圖是view controller的view,因?yàn)檫@個(gè)view也不能處理事件,因此傳給view controller
若view controller也不能處理此事件,則傳到window
若window也不能處理此事件,則傳到app單例對(duì)象Application
若UIApplication單例對(duì)象也不能處理,則表示無效事件
右半圖:

initial view一直傳遞直到最上層view(原話:A view passes an event up its view controller’s view hierarchy until it reaches the topmost view.)
topmost view傳遞事件到它所在的控制器(原話:The topmost view passes the event to its view controller.)
view controller傳遞事件到topmost view的父視圖,重復(fù)前三步,走到到達(dá)root controller(原話:passes the event to its topmost view’s superview. Steps 1-3 repeat until the event reaches the root view controller.)
由root控制器傳遞事件到window(原話:The root view controller passes the event to the window object.)
若window也不能處理此事件,則傳到app單例對(duì)象Application
若UIApplication單例對(duì)象也不能處理,則表示無效事件

hit-testing還有兩點(diǎn)點(diǎn)個(gè)人感覺比較關(guān)鍵的點(diǎn)。
一、首先這個(gè)View它會(huì)檢查自己是否能夠接收觸摸事件(有三點(diǎn)不能接收觸摸事件:1、透明度<0.1,2、hidden=YES的時(shí)候,3、userInteractionEnabled = NO),然后它才會(huì)判斷當(dāng)前點(diǎn)在不在自己身上
二、當(dāng)它遍歷子控件的時(shí)候,是倒序遍歷的

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 用戶以多種方式操縱他們的iOS設(shè)備,例如觸摸屏幕或搖動(dòng)設(shè)備。 iOS會(huì)解釋用戶何時(shí)以及如何操作硬件并將此信息傳遞到...
    坤坤同學(xué)閱讀 4,120評(píng)論 7 19
  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件。本想自己總結(jié)一下,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載。作者:L...
    WQ_UESTC閱讀 6,246評(píng)論 4 26
  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點(diǎn)擊了?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 59,483評(píng)論 51 604
  • 上一篇文章簡單介紹了UIView的構(gòu)成,其實(shí)ios中的其他ui控件,如UIWindow,UIButton,UIla...
    redihd閱讀 6,579評(píng)論 5 14
  • 一. Hit-Testing 什么是Hit-Testing?對(duì)于觸摸事件, window首先會(huì)嘗試將事件交給事件觸...
    面糊閱讀 1,035評(píng)論 0 50

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