文章末尾有兩個(gè)開(kāi)發(fā)中經(jīng)常遇到問(wèn)題的例子,不要錯(cuò)過(guò)喲~
前提:
UIView不接受事件處理的情況主要有以下三種
1、alpha <0.01
2、userInteractionEnabled = NO
3、hidden = YES
過(guò)程:

當(dāng)我們點(diǎn)擊View D的位置時(shí):系統(tǒng)調(diào)用 hitTest:withEvent: 方法尋找更合適的view,如果子控件是合適的view,則在子控件再調(diào)用hitTest:withEvent:查看子控件是不是合適的view,一直遍歷,直到找到最合適的view。過(guò)程如下:
1.觸摸的CGPoint在View A上嗎?在的,繼續(xù)測(cè)試A的子視圖View B、View C
2.在View B上嗎?不。在View C上嗎?在,繼續(xù)C的子視圖View D、View E
3.在View D上嗎?不,且D無(wú)subview,結(jié)束此分支
4.在View E上嗎?在,E無(wú)subview,結(jié)束此分支
5.結(jié)果形成了一個(gè)鏈,View A -->View C -->View E
當(dāng)View E無(wú)法處理此事件怎么辦?按照響應(yīng)鏈往上回溯即可,一直回溯到application,也無(wú)人處理此事件,則將事件【丟棄】。
注意:所有的響應(yīng)鏈都是父子視圖的關(guān)系,如果View A、View C、 VIew E只是視覺(jué)上遮蓋了,但是卻不是superview、subview的關(guān)系,則事件是不會(huì)在兩者之間傳遞的
事件處理兩個(gè)例子:

如圖:
1、如果b的userInteractionEnabled為NO,給a添加UITapGestureRecognizer點(diǎn)擊事件,點(diǎn)擊b會(huì)響應(yīng)a的點(diǎn)擊事件嗎?
會(huì)。因?yàn)辄c(diǎn)擊b發(fā)生觸摸事件時(shí),系統(tǒng)會(huì)從父控件進(jìn)行遍歷。因?yàn)閍添加了點(diǎn)擊事件,且b的userInteractionEnabled為NO,不接受事件處理。則系統(tǒng)認(rèn)為a是適合處理事件的view。
2、如果a的userInteractionEnabled為NO,給b添加UITapGestureRecognizer點(diǎn)擊事件,點(diǎn)擊b會(huì)響應(yīng)自己的點(diǎn)擊事件嗎?
不會(huì)。因?yàn)辄c(diǎn)擊b發(fā)生觸摸事件時(shí),系統(tǒng)會(huì)從父控件進(jìn)行遍歷。作為b的父控件,如果a的userInteractionEnabled為NO,a不接受事件處理,則無(wú)法傳遞到b,所以b不響應(yīng)