當(dāng)我們?cè)谑謾C(jī)屏幕上進(jìn)行了一次點(diǎn)擊,或者滑動(dòng)芽卿,輕掃手機(jī)屏幕揭芍,接下來,我們的手機(jī)該如何回應(yīng)我們的指令卸例,軟件又經(jīng)歷了哪些過程呢称杨?這篇文章是我自己的簡(jiǎn)單理解,如有不當(dāng)筷转,請(qǐng)指出姑原。
1、事件鏈
當(dāng)我們用手指輕觸屏幕呜舒,首先是app的UIApplication對(duì)象接收到了這次點(diǎn)擊事件锭汛,緊接著,UIApplication對(duì)象把這次點(diǎn)擊傳遞給了UIWindow對(duì)象阴绢,UIWindow對(duì)象繼續(xù)向他的子View對(duì)象傳遞店乐,直到傳遞到最上層。舉個(gè)例子:
我理解的就是呻袭,app會(huì)把點(diǎn)擊事件通過傳給他上面的每一個(gè)子View眨八,至于誰來響應(yīng),那就是響應(yīng)鏈了左电。就像上圖那樣廉侧,點(diǎn)擊了紅色的View页响,傳遞過程是這樣的:
UIApplication對(duì)象——>UIWindow對(duì)象——>rootVC.view對(duì)象——>redview對(duì)象,blueView對(duì)象。
2段誊、響應(yīng)鏈
當(dāng)每一個(gè)view都收到點(diǎn)擊事件之后闰蚕,誰來做出響應(yīng)呢?首先连舍,能夠響應(yīng)這個(gè)點(diǎn)擊的是誰呢没陡?能夠響應(yīng)事件的View,userInteractionEnabled屬性一定要是yes索赏。
響應(yīng)過程是和時(shí)間傳遞過程相反的盼玄。
最上面的紅色view發(fā)現(xiàn)點(diǎn)擊事件是在自己的范圍內(nèi),且自己可以響應(yīng)這個(gè)事件潜腻,那么他就不再向下傳遞了埃儿,這就可以理解兩個(gè)按鈕,如果都可以響應(yīng)點(diǎn)擊事件融涣,那么正常情況下應(yīng)該是上面的按鈕響應(yīng)點(diǎn)擊事件童番。如果紅色的View發(fā)現(xiàn)自己不具備響應(yīng)這個(gè)事件的能力,那么他會(huì)把事件繼續(xù)向下傳遞威鹿,傳遞到他的上一層也就是rootVC.view剃斧,就這樣依次向下傳遞,直到UIwindow層专普,發(fā)現(xiàn)依然沒有可以響應(yīng)的View悯衬,那么這個(gè)點(diǎn)擊事件就沒有響應(yīng)者,點(diǎn)擊無效檀夹。
總結(jié)
view會(huì)調(diào)用hitTest:withEvent:方法筋粗,hitTest:withEvent:方法底層會(huì)調(diào)用pointInside:withEvent:方法判斷觸摸點(diǎn)是不是在這個(gè)view的坐標(biāo)系上。如果在坐標(biāo)系上炸渡,會(huì)分發(fā)事件給這個(gè)view的子view娜亿。然后每個(gè)字view重復(fù)以上步驟,直至最底層的一個(gè)合適的view蚌堵。
事件響應(yīng)會(huì)先從底層最合適的view開始买决,然后隨著上一步找到的鏈一層一層響應(yīng)事件。如需吞并事件只需重寫touchesBegan: withEvent:方法吼畏,并不調(diào)用父類方法即可督赤。