1、事件的產生及傳遞
發生觸摸事件后,系統會將事件加入到一個由UIApplication管理的事件隊列中,
UIApplication會從事件隊列中取出最前面的事件,并將事件發放下去以便處理,通常先發送給應用程序的主窗口
主窗口會在視圖層次結構中選出最合適的試圖控件,來處理事件,這也是整個過程的第一步
找到合適的視圖控件后,就會調用最合適的視圖控件的touches方法來處理事件,
2、如何尋找最合適的視圖控件?
自己能否接受觸摸事件
觸摸點是否在自己身上
從后往前遍歷所有子控件,重復前兩步
如果沒有最合適的view,那么就自己最適合處理
3、事件的響應
? ? 找到最合適的view后調用touches方法,系統的默認做法是沿著響應者鏈條向上傳遞
? ? 3.1響應者鏈條
? ? 由多個響應者連接而成的鏈條
? ? 能清楚的觀察到每個響應者之間的關系,并且可以使一個事件可以被多個對象處理
? ? 3.2響應者
? ? 繼承自UIResponder的對象
? ? 具備處理事件的能力
? ? 3.3如何尋找上一個響應者
? ? 當前的view是控制器的view,那么上一個響應者就是控制器
? ? 當前的view不是控制器的view,那么上一個響應者就是父控件
? ? 找到上一個響應者,繼續調用上一個響應者的touches方法,以此類推
4.事件傳遞的完整過程
先將事件對象從上往下進行傳遞,(即父控件傳遞給子控件)找到最合適的視圖控件來處理事件
調用最合適的視圖控件的touches方法處理事件
如果調用了[super touches….];就會將事件順著響應者鏈條往上傳遞,傳遞給上一個響應者
接著就會調用上一個響應者的touches….方法
5.響應者鏈條的事件傳遞過程
如果view的控制器存在,就傳遞給控制器,如果view的控制器不存在,就傳遞給父控件
在視圖層次的最頂端如果也不能處理事件或消息,那么就將該事件傳遞給UIWindow對象
如果UIWindow對象也不能處理事件或消息,那么就將事件傳遞給UIApplication
如果UIApplication對象也不能處理事件或消息,那么就將事件丟棄
6.不能接收事件的五種方式
userInteractionEnabled == NO
hidden == YES
alpha <= 0.01
父控件不能接收事件
子控件超出父控件的尺寸