簡(jiǎn)述iOS系統(tǒng)中的觸屏事件分發(fā)及響應(yīng)流程
本文轉(zhuǎn)載自 CocoaChina 作者:alvin_wang
更詳細(xì)說(shuō)明可以參考 <簡(jiǎn)書 — 劉小壯> http://www.reibang.com/p/b0884faae603
所有繼承響應(yīng)者對(duì)象UIResponder都能接收并處理事件。按照時(shí)間順序座哩,先找到到最合適的view能曾,然后就會(huì)調(diào)用view的touches方法项乒,這些方法的默認(rèn)做法是將事件順著響應(yīng)這鏈條向上傳遞,將事件交由上一個(gè)響應(yīng)者進(jìn)行處理柄慰,直到有一個(gè)view能處理該響應(yīng)為止或者丟棄。這是一個(gè)從上到下,再?gòu)南碌缴系倪^(guò)程贱枣。
1.事件的產(chǎn)生
- 發(fā)生事件后,系統(tǒng)會(huì)將該事件加入到一個(gè)由UIApplication管理的事件隊(duì)列中颤专。
- UIApplication會(huì)從事件隊(duì)列中取出最前面的事件纽哥,并將該事件分發(fā)下去處理。通常栖秕,先發(fā)送事件給應(yīng)用程序的主窗口(keywindow)春塌。
- keywindow會(huì)在視圖層次結(jié)構(gòu)中找到一個(gè)最合適的視圖來(lái)處理事件。
2.事件的傳遞
- 事件的傳遞先從父控件傳遞到子控件(UIApplication->window->尋找處理事件最合適的view)。
- 如果父view不能接受觸摸事件只壳,那么子view也不能接收到觸摸事件俏拱。
2.1 如何找到最合適的view來(lái)處理事件
判斷keywindow自己是否接受事件
判斷事件是否在自己身上
子view數(shù)組中從后往前遍歷子控件,重復(fù)前面1,2步驟
如果沒(méi)有合適的子控件吼句,那自己就是最合適的控件
2.2 尋找最合適的view底層剖析
有兩個(gè)重要的方法:
hitTest:withEvent:
pointInside:withEvent:
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远搪。
3.事件的響應(yīng)
事件響應(yīng)會(huì)先從底層最合適的view開始劣纲,然后隨著上一步找到的鏈一層一層響應(yīng)touch事件。默認(rèn)touch事件會(huì)傳遞給上一層谁鳍。如果到了viewcontroller的view味廊,就會(huì)傳遞給viewcontroller。如果viewcontroller不能處理棠耕,就會(huì)傳遞給UIWindow余佛。如果UIWindow無(wú)法處理,就會(huì)傳遞給UIApplication窍荧。如果UIApplication無(wú)法處理辉巡,就會(huì)傳遞給UIApplicationDelegate。如果UIApplicationDelegate不能處理蕊退,則會(huì)丟棄該事件郊楣。
簡(jiǎn)述iOS系統(tǒng)中的觸屏事件分發(fā)及響應(yīng)流程
本文轉(zhuǎn)載自 CocoaChina 作者:alvin_wang
更詳細(xì)說(shuō)明可以參考 <簡(jiǎn)書 — 劉小壯> http://www.reibang.com/p/b0884faae603
所有繼承響應(yīng)者對(duì)象UIResponder都能接收并處理事件。按照時(shí)間順序瓤荔,先找到到最合適的view净蚤,然后就會(huì)調(diào)用view的touches方法,這些方法的默認(rèn)做法是將事件順著響應(yīng)這鏈條向上傳遞输硝,將事件交由上一個(gè)響應(yīng)者進(jìn)行處理今瀑,直到有一個(gè)view能處理該響應(yīng)為止或者丟棄。這是一個(gè)從上到下点把,再?gòu)南碌缴系倪^(guò)程橘荠。
1.事件的產(chǎn)生
- 發(fā)生事件后,系統(tǒng)會(huì)將該事件加入到一個(gè)由UIApplication管理的事件隊(duì)列中郎逃。
- UIApplication會(huì)從事件隊(duì)列中取出最前面的事件哥童,并將該事件分發(fā)下去處理。通常褒翰,先發(fā)送事件給應(yīng)用程序的主窗口(keywindow)贮懈。
- keywindow會(huì)在視圖層次結(jié)構(gòu)中找到一個(gè)最合適的視圖來(lái)處理事件匀泊。
2.事件的傳遞
- 事件的傳遞先從父控件傳遞到子控件(UIApplication->window->尋找處理事件最合適的view)。
- 如果父view不能接受觸摸事件朵你,那么子view也不能接收到觸摸事件各聘。
2.1 如何找到最合適的view來(lái)處理事件
判斷keywindow自己是否接受事件
判斷事件是否在自己身上
子view數(shù)組中從后往前遍歷子控件,重復(fù)前面1,2步驟
如果沒(méi)有合適的子控件撬呢,那自己就是最合適的控件
2.2 尋找最合適的view底層剖析
有兩個(gè)重要的方法:
hitTest:withEvent:
pointInside:withEvent:
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芯勘。
3.事件的響應(yīng)
事件響應(yīng)會(huì)先從底層最合適的view開始,然后隨著上一步找到的鏈一層一層響應(yīng)touch事件腺逛。默認(rèn)touch事件會(huì)傳遞給上一層荷愕。如果到了viewcontroller的view,就會(huì)傳遞給viewcontroller棍矛。如果viewcontroller不能處理安疗,就會(huì)傳遞給UIWindow。如果UIWindow無(wú)法處理够委,就會(huì)傳遞給UIApplication荐类。如果UIApplication無(wú)法處理,就會(huì)傳遞給UIApplicationDelegate茁帽。如果UIApplicationDelegate不能處理玉罐,則會(huì)丟棄該事件。