文章末尾有兩個(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)