iOS中手勢操作事件的產生于傳遞
發生觸摸事件后,系統會將該事件加入到一個由UIApplication管理的事件隊列中
UIApplication會從事件隊列中取出最前面的事件,并將事件分發下去以便處理,通常,先發送事件給應用程序的主窗口(keyWindow)
主窗口會在視圖層次結構中找到一個最合適的視圖來處理觸摸事件,但是這僅僅是整個事件處理過程的第一步
找到合適的視圖控件后,就會調用視圖控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…
觸摸事件的傳遞是從父控件傳遞到子控件
注意:如果父控件不能接收觸摸事件,那么子控件就不可能接收到觸摸事件(掌握)
如何找到最合適的控件來處理事件?
1> 自己是否能接收觸摸事件?否,事件傳遞到此結束
2> 觸摸點是否在自己身上?否,事件傳遞到此結束
3> 從后往前遍歷子控件,重復前面的兩個步驟
4> 如果沒有符合條件的子控件,那么就自己最適合處理
UIView不接受觸摸事件的三種情況:
不接收用戶交互
userInteractionEnabled = NO
隱藏
hidden = YES
透明
alpha = 0.0 ~ 0.01
提示:UIImageView的userInteractionEnabled默認就是NO,因此UIImageView以及它的子控件默認是不能接收觸摸事件的
觸摸事件處理的詳細過程
用戶點擊屏幕后產生的一個觸摸事件,經過一系列的傳遞過程后,會找到最合適的視圖控件來處理這個事件
找到最合適的視圖控件后,就會調用控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…
這些touches方法的默認做法是將事件順著響應者鏈條向上傳遞,將事件交給上一個響應者進行處理
響應者鏈條
響應者鏈條:是由多個響應者對象連接起來的鏈條
作用:能很清楚的看見每個響應者之間的聯系,并且可以讓一個事件多個對象處理。
響應者對象:能處理事件的對象
事件傳遞的完整過程
1> 先將事件對象由上往下傳遞(由父控件傳遞給子控件),找到最合適的控件來處理這個事件。
2> 調用最合適控件的touches….方法
3> 如果調用了[super touches….];就會將事件順著響應者鏈條往上傳遞,傳遞給上一個響應者
4> 接著就會調用上一個響應者的touches….方法
如何判斷上一個響應者
1> 如果當前這個view是控制器的view,那么控制器就是上一個響應者
2> 如果當前這個view不是控制器的view,那么父控件就是上一個響應者
響應者鏈的事件傳遞過程
如果view的控制器存在,就傳遞給控制器;如果控制器不存在,則將其傳遞給它的父視圖
在視圖層次結構的最頂級視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給window對象進行處理
如果window對象也不處理,則其將事件或消息傳遞給UIApplication對象
如果UIApplication也不能處理該事件或消息,則將其丟棄