iOS中觸控事件的傳遞和響應機制

weixin_33670713發表於2017-12-19

所有繼承響應者物件UIResponder都能接收並處理事件。按照時間順序,先找到到最合適的view,然後就會呼叫view的touches方法,這些方法的預設做法是將事件順著響應這鏈條向上傳遞,將事件交由上一個響應者進行處理,直到有一個view能處理該響應為止或者丟棄。這是一個從上到下,再從下到上的過程。

1. 事件的產生
  • 發生事件後,系統會將該事件加入到一個由UIApplication管理的事件佇列中。
  • UIApplication會從事件佇列中取出最前面的事件,並將該事件分發下去處理。通常,先傳送事件給應用程式的主視窗(keywindow)。
  • keywindow會在檢視層次結構中找到一個最合適的檢視來處理事件。
2. 事件的傳遞

事件的傳遞先從父控制元件傳遞到子控制元件(UIApplication->window->尋找處理事件最合適的view)。
如果父view不能接受觸控事件,那麼子view也不能接收到觸控事件。

2.1 如何找到最合適的view來處理事件
  1. 判斷keywindow自己是否接受事件
  2. 判斷事件是否在自己身上
  3. 子view陣列中從後往前遍歷子控制元件,重複前面1,2步驟
  4. 如果沒有合適的子控制元件,那自己就是最合適的控制元件
2.2 尋找最合適的view底層剖析

有兩個重要的方法:

hitTest:withEvent:
pointInside:withEvent:

view會呼叫hitTest:withEvent:方法,hitTest:withEvent:方法底層會呼叫pointInside:withEvent:方法判斷觸控點是不是在這個view的座標系上。如果在座標系上,會分發事件給這個view的子view。然後每個字view重複以上步驟,直至最底層的一個合適的view。

3.事件的響應

事件響應會先從底層最合適的view開始,然後隨著上一步找到的鏈一層一層響應touch事件。預設touch事件會傳遞給上一層。如果到了viewcontroller的view,就會傳遞給viewcontroller。如果viewcontroller不能處理,就會傳遞給UIWindow。如果UIWindow無法處理,就會傳遞給UIApplication。如果UIApplication無法處理,就會傳遞給UIApplicationDelegate。如果UIApplicationDelegate不能處理,則會丟棄該事件。


793918-96612e4b561ab6ea.png
image.png

相關文章