標籤:style class blog http color com
iOS開發UI篇—事件傳遞
一、事件的產生和傳遞
發生觸摸事件後,系統會將該事件加入到一個由UIApplication管理的事件隊列中
UIApplication會從事件隊列中取出最前面的事件,並將事件分發下去以便處理,通常,先發送事件給應用程式的主視窗(keyWindow)
主視窗會在視圖階層中找到一個最合適的視圖來處理觸摸事件
找到合適的視圖控制項後,就會調用視圖控制項的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…
二、事件傳遞過程樣本
觸摸事件的傳遞是從父控制項傳遞到子控制項
點擊了綠色的view:UIApplication -> UIWindow -> 白色 -> 綠色
點擊了藍色的view:UIApplication -> UIWindow -> 白色 -> 橙色 -> 藍色
點擊了黃色的view:UIApplication -> UIWindow -> 白色 -> 橙色 -> 藍色 -> 黃色
注意:如果父控制項不能接收觸摸事件,那麼子控制項就不可能接收到觸摸事件
如何找到最合適的控制項來處理事件?
(1)自己是否能接收觸摸事件?
(2)觸摸點是否在自己身上?
(3)從後往前遍曆子控制項,重複前面的兩個步驟
(4)如果沒有合格子控制項,那麼就自己最適合處理
樣本:
搭建如下介面,每個自訂的view分別用一個類來進行管理。
建立一個繼承自view的基類,讓其他的自訂view繼承自該類,在該類中重寫下面的代碼。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
NSLog(@"%@" , self.class);
}
三、不接受觸摸事件的三種情況
(1)不接收使用者互動 userInteractionEnabled = NO
(2)隱藏 hidden = YES
(3)透明 alpha = 0.0 ~ 0.01
提示:UIImageView的userInteractionEnabled預設就是NO,因此UIImageView以及它的子控制項預設是不能接收觸摸事件的