iOS總結-有關UITouch事件(二)之 UIEvent
UIEvent
在touch的四個方法裡, NSSet * touches 和 UIEvent *event 兩個引數
一個完整的觸控過程中,只產生一個事件物件,4個觸控方法是同一個event引數
兩個手指同時觸控一個view,touchBegan:withEvent:方法,touches引數中裝著2個UITouch物件
可以根據touches中UITouch個數來判斷單點還是多點觸控
響應者物件:只有繼承了UIResponder的物件才能接收、處理事件,如UIApplication / UIViewController/ UIView/ UIWindow
事件產生和傳遞過程
1.發生觸控事件後,系統會將該事件加入到一個由UIApplication管理的事件佇列中
2.UIApplication會從事件佇列中取出最前面的事件,並將事件分發下去以便處理,通常先發送事件給應用程式的主視窗keyWindow
3.主視窗會在檢視層次結構中找到一個最合適的檢視來處理觸控事件,這也是整個事件處理過程的第一步
4.找到合適的檢視控制元件後,就會呼叫檢視控制元件的touches方法來作具體的事件處理
主視窗如何找到最合適的控制元件來處理事件
1.判斷自己是否能接收觸控事件
2.判斷觸控點是否在自己身上
3.從後往前遍歷子控制元件,重複前面兩個步驟
4.如果沒有符合條件的子控制元件,那麼就自己最適合處理
如果父控制元件不能接收觸控事件,子控制元件就不可能接收到觸控事件
UIView不接受觸控事件的三種情況
1.不接受使用者互動 userInteractionEnabled = NO
2.隱藏 hidden = YES
3,透明 alpha = 0.0~0.1
觸控事件處理的詳細過程 (響應鏈的傳遞過程)
1.使用者點選屏幕後產生一個觸控事件, 經過一系列的傳遞過程後,會找到最合適的檢視控制元件來處理這個事件
2.找到最合適的檢視控制元件後,就會呼叫控制元件的touches方法來做具體事件處理
3.這些touches方法的預設做法是將事件順著響應者鏈條向上傳遞,將事件交給上一個響應者進行處理
4.判斷上一個響應者,如果view的控制器存在,控制器就為上一個響應者,傳遞給控制器,如果控制器不存在,其父檢視為上一個響應者,將其傳遞給它的父檢視
5.在檢視層次結構的最頂級檢視,如果不能處理收到的事件或訊息,將其傳遞給window物件處理
6.如果window不處理,傳遞給UIApplication物件
7.如果UIApplication也不能處理,丟棄。
響應者鏈條:有多個響應者物件連線起來的鏈條,能很清楚的看到每個響應者之間的聯絡,可以讓一個事件多個物件處理。
響應者物件:能處理事件的物件