本文轉自:http://www.linuxidc.com/Linux/2015-08/121270.htm 6.橙2都滿足最上面兩個條件,遍歷子控制項,先取出紅3 7.紅3不滿足條件2,取出藍3 8.藍3也不滿足條件2,最後最合適的控制項是橙2 找到合適的控制項之後就要進行響應了,這裡先介紹一下響應者鏈條
本文轉自:http://www.linuxidc.com/Linux/2015-08/121270.htm
首先我們來看看ios中事件的產生和傳遞過程 1.發生觸摸事件後,系統會將事件加入到一個由UIApplication管理的隊列事件中來 2.UIApplication會從事件隊列中取出最前面的事件,並將事件分發下去以便處理,通常會發發送事件給應用程式的主視窗 3.主視窗會在視圖層次結構中找到一個最合適的視圖來處理觸摸事件 4.找到合適的視圖控制項後,就會調用視圖控制項的touches方法作為事件的具體處理結果:toucheesBegin...touchesMoved...touchesEnded等 5.這些透徹是方法預設的做法是將事件順著響應者鏈條向上傳遞,將事件叫個上一個相應者進行處理,舉個例子 一般事件的傳遞是從父控制項傳遞到子控制項 的 例如:點擊了綠色的View,傳遞過程如下:UIApplication->windows->白色View->綠色View 點擊藍色的View,傳遞過程如下:UIApplication->Windows->白色View->橙色View->藍色View 如果父控制項接收不到觸摸事件,那麼子控制項就不可能接收到觸摸事件 UIView不能接收觸摸事件的三種情況 1.不接受用戶交互:userInteractionEnabled=NO; 2.隱藏:hidden=YES; 3.透明:alpha=0.0-0.1; 如何找到最合適的控制項來處理事件呢?有一下準則 1.自己是否能接受觸摸事件 2.觸摸點是否在自己身上 3.從後向前遍歷子控制項,重覆上面的兩個步驟 4.如果沒有符合條件的子控制項,那麼自己最適合處理 例如 說明一下控制項的添加順序:白1->綠2->橙2->藍3->紅3->黃4-> 這裡點擊了橙色的那塊區域,事件傳遞判斷過程如下: 1.UIApplication從事件隊列中取出事件分發給UIWindows 2.UIWondows 判斷自己是否能接受 觸摸事件。可以 3.UIWindows判斷觸摸點是否在自己的身上 是的 4.UIWindows從後往前遍歷自己的子空間,取出白16.橙2都滿足最上面兩個條件,遍歷子控制項,先取出紅3
7.紅3不滿足條件2,取出藍3
8.藍3也不滿足條件2,最後最合適的控制項是橙2
找到合適的控制項之後就要進行響應了,這裡先介紹一下響應者鏈條:響應者鏈條其實就是很多響應者對象(繼承自UIResponder的對象)一起組合起來的鏈條稱之為響應者鏈條
一般預設做法是控制項將事件順著響應者鏈條向上傳遞,將事件交給上一個響應者進行處理。那麼如何判斷當前響應者的上一個響應者是誰呢?有以下兩個規則:
1.判斷當前是否是控制器的View,如果是控制器的View,上一個響應者就是控制器
2.如果不是控制器的View,上一個響應者就是父控制項
響應過程如下圖:
如果控制器也不響應響應touches方法,就交給UIWindow。如果UIWindow也不響應,交給UIApplication,如果都不響應事件就作廢了。
最後總結來說一次完整的觸摸事件的傳遞響應過程為:
UIApplication-->UIWindow-->遞歸找到最合適處理的控制項-->控制項調用touches方法-->判斷是否實現touches方法-->沒有實現預設會將事件傳遞給上一個響應者-->找到上一個響應者-->找不到方法作廢
PS:利用響應者鏈條我們可以通過調用touches的super 方法,讓多個響應者同時響應該事件。