1. 程式人生 > >iOS總結-有關UITouch事件(二)之 UIEvent

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也不能處理,丟棄。

響應者鏈條:有多個響應者物件連線起來的鏈條,能很清楚的看到每個響應者之間的聯絡,可以讓一個事件多個物件處理。

響應者物件:能處理事件的物件

參考:https://www.jianshu.com/p/44a5b59e7e85