响应者链
2019獨角獸企業重金招聘Python工程師標準>>>
事件處理的事件傳遞
簡介:
發生觸摸事件后,系統會將該事件加入到一個由UIApplication管理的事件?隊列中,UIApplication會從事件隊列中取出最前面的事件,并將事件分發下去以便處理,通常,先發送事件給應用程序的主窗口(keyWindow)
UIView不接受觸摸事件的三種情況:
不接收用戶交互
userInteractionEnabled = NO
隱藏
hidden = YES
透明
alpha = 0.0 ~ 0.01
提示:UIImageView的userInteractionEnabled默認就是NO,因此UIImageView以及它的子控件默認是不能接收觸摸事件的
事件傳遞的詳細過程:
主窗口會在視圖層次結構中 找到一個最合適的視圖來處理觸摸事件,但是這僅僅是整個事件處理過程的第一步 找到合適的視圖控件后,就會調用視圖控件的touches方法來作具體的事件處理touchesBegan…
touchesMoved…
touchedEnded… 這些touches方法的 默認做法是將事件順著 響應者鏈條向上傳遞,將事件交給 上一個響應者進行處理
示例:
響應者鏈條
事件傳遞的完整過程
先將事件對象由上往下傳遞(由父控件傳遞給子控件),找到最合適的控件來處理這個事件。 調用最合適控件的touches….方法 如果調用了[super touches….];就會將事件順著響應者鏈條往上傳遞,傳遞給上一個響應者 接著就會調用上一個響應者的touches….方法如何判斷上一個響應者
如果當前這個view是控制器的view,那么控制器就是上一個響應者 如果當前這個view不是控制器的view,那么父控件就是上一個響應者響應者鏈條的事件傳遞過程
如果view是控制器的view,就傳遞給控制器;如不是,則將其傳遞給它的父視圖 在視圖層次結構的最頂級視圖,如果也不能處理收到的事件或消息,則其將事件或消息傳遞給window對象進行處理 如果window對象也不處理,則其將事件或消息傳遞給UIApplication對象 如果UIApplication也不能處理該事件或消息,則將其丟棄注意
為什么用隊列管理事件,而不用棧?
隊列先進先出,能保證先產生的事件先處理。棧先進后出。
轉載于:https://my.oschina.net/550872569/blog/652173
總結
- 上一篇: 终端
- 下一篇: iOS UI_APPEARANCE_SE