測(cè)試響應(yīng)者鏈

這樣的層次結(jié)構(gòu)

---A

? ? ? ?---B

? ? ? ?---C

? ? ? ? ? ? ? ---D

既A包含B和C,C包含D


當(dāng)C的書信clipsTobounds為NO的時(shí)候,運(yùn)行之后顯示這樣的結(jié)果:




當(dāng)我們點(diǎn)擊D超出C的部分時(shí)候,將會(huì)是誰響應(yīng)事件尼?




對(duì)的,這就是打印的結(jié)果,是不是非常吃驚!為什么會(huì)出現(xiàn)這樣的結(jié)果尼?道理其實(shí)非常簡(jiǎn)單,當(dāng)屏幕收到一個(gè)觸摸事件的時(shí)候,就會(huì)開始進(jìn)行命中測(cè)試既hit-test,大致的過程如下:

1. ?判斷UIApplication是否命中觸摸事件,是的!就將事件傳遞給window。

2. ?判斷window是否命中了事件,是的!就將事件傳遞給controller。

3. ?判斷controller是否命中事件,是的!就將事件傳遞給controller的rootview。

4. ?以此類推,判斷Aview是否命中事件,是的!就會(huì)遍歷它所有的子view,分別判斷每個(gè)子view是否命中事件,發(fā)現(xiàn)Bview沒有命中事件,就停止對(duì)Bview的hit-test。發(fā)現(xiàn)Cview也沒有命中事件,就停止了對(duì)Cview及其子view的hit-test。

5. ?這樣一來在整個(gè)響應(yīng)者層級(jí)中,最頂端(注意:整個(gè)響應(yīng)者鏈就是一顆多叉樹)命中觸摸事件的view就是A(因?yàn)锳的直接子view沒有命中事件),因此系統(tǒng)認(rèn)為A就是最適合處理該事件的響應(yīng)者,稱為第一響應(yīng)者具備了優(yōu)先響應(yīng)事件處理的能力。所以就會(huì)出現(xiàn)如上的打印咯!

那么問題來了,怎么樣才能讓點(diǎn)擊D超出C的部分時(shí)候D也能響應(yīng)尼?我們知道,雖然我們點(diǎn)擊事件發(fā)生在D區(qū)域內(nèi),但是不在C區(qū)域類,而C是D的父親,故父view不能命中事件,從而導(dǎo)致了子view也不能命中事件。

那么解決的突破口就在于如何讓C進(jìn)行命中測(cè)試(hit-test)的時(shí)候能夠命中事件。OK!只需要在C中重寫方法-(UIView*)hitTest:(CGPoint)point?withEvent:(UIEvent*)event就行啦,具體的代碼如下:


大家應(yīng)該知道,在進(jìn)行命中測(cè)試的時(shí)候會(huì)調(diào)用hitTest:withEvent:方法,故在此我們重寫了該方法。現(xiàn)在就能達(dá)到我們想要的效果啦!

示例代碼在此:示例代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 用戶以多種方式操縱他們的iOS設(shè)備,例如觸摸屏幕或搖動(dòng)設(shè)備。 iOS會(huì)解釋用戶何時(shí)以及如何操作硬件并將此信息傳遞到...
    坤坤同學(xué)閱讀 4,036評(píng)論 7 19
  • 一. Hit-Testing 什么是Hit-Testing?對(duì)于觸摸事件, window首先會(huì)嘗試將事件交給事件觸...
    面糊閱讀 879評(píng)論 0 50
  • 好奇觸摸事件是如何從屏幕轉(zhuǎn)移到APP內(nèi)的?困惑于Cell怎么突然不能點(diǎn)擊了?糾結(jié)于如何實(shí)現(xiàn)這個(gè)奇葩響應(yīng)需求?亦或是...
    Lotheve閱讀 58,015評(píng)論 51 603
  • 在iOS開發(fā)中經(jīng)常會(huì)涉及到觸摸事件。本想自己總結(jié)一下,但是遇到了這篇文章,感覺總結(jié)的已經(jīng)很到位,特此轉(zhuǎn)載。作者:L...
    WQ_UESTC閱讀 6,133評(píng)論 4 26
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,937評(píng)論 18 139