事件的產(chǎn)生和傳遞
(1).發(fā)生觸摸事件后撵幽,系統(tǒng)會將該事件加入到一個由UIApplication管理的事件隊列中
(2).UIApplication會從事件隊列中取出最前面的事件尝蠕,并將事件分發(fā)下去以便處理血柳,通常,先發(fā)送事件給應(yīng)用程序的主窗口(keyWindow)
(3).主窗口會在視圖層次結(jié)構(gòu)中找到一個最合適的視圖來處理觸摸事件(通過hittest:withEvent:)宾茂,這也是整個事件處理過程的第一步
(4).找到合適的視圖控件后瓷马,就會調(diào)用視圖控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…
觸摸事件處理的詳細(xì)過程
(1).用戶點(diǎn)擊屏幕后產(chǎn)生的一個觸摸事件,經(jīng)過一系列的傳遞過程后跨晴,會找到最合適的視圖控件來處理這個事件(通過hittest:withEvent:)
(2).找到最合適的視圖控件后欧聘,就會調(diào)用控件的touches方法來作具體的事件處理
touchesBegan…
touchesMoved…
touchedEnded…
(3).這些touches方法的默認(rèn)做法是將事件順著響應(yīng)者鏈條向上傳遞,將事件交給上一個響應(yīng)者進(jìn)行處理
事件傳遞的完整過程
1> 先將事件對象由上往下傳遞(由父控件傳遞給子控件)端盆,找到最合適的控件來處理這個事件(通過hittest:withEvent:)怀骤。
2> 調(diào)用最合適控件的touches….方法
3> 如果調(diào)用了[super touches….];就會將事件順著響應(yīng)者鏈條往上傳遞,傳遞給上一個響應(yīng)者
4> 接著就會調(diào)用上一個響應(yīng)者的touches….方法
如何判斷上一個響應(yīng)者
1> 如果當(dāng)前這個view是控制器的view,那么控制器就是上一個響應(yīng)者
2> 如果當(dāng)前這個view不是控制器的view,那么父控件就是上一個響應(yīng)者
響應(yīng)者鏈的事件傳遞過程
1>如果view的控制器存在焕妙,就傳遞給控制器蒋伦;如果控制器不存在,則將其傳遞給它的父視圖
2>在視圖層次結(jié)構(gòu)的最頂級視圖焚鹊,如果也不能處理收到的事件或消息痕届,則其將事件或消息傳遞給window對象進(jìn)行處理
3>如果window對象也不處理,則其將事件或消息傳遞給UIApplication對象
4>如果UIApplication也不能處理該事件或消息末患,則將其丟棄
實(shí)現(xiàn)hittest:withEvent:方法(該方法用于找到最合適的UIView來接收該觸摸事件)
// 作用:尋找最合適view
// 什么時候調(diào)用,只要一個事件傳遞給一個控件,就會調(diào)用這個控件的hitTest
// 返回誰,誰就是最合適view
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 1.判斷下自己能否接收事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
// 2.判斷下點(diǎn)在不在當(dāng)前控件上
if ([self pointInside:point withEvent:event] == NO) return nil; // 點(diǎn)不在當(dāng)前控件
// 3.從后往前遍歷自己的子控件
// 1 0
int count = self.subviews.count;
for (int i = count - 1; i >= 0; i--) {
// 獲取子控件
UIView *childView = self.subviews[i];
// 把當(dāng)前坐標(biāo)系上的點(diǎn)轉(zhuǎn)換成子控件上的點(diǎn)
CGPoint childP = [self convertPoint:point toView:childView];
UIView *fitView = [childView hitTest:childP withEvent:event];
if (fitView) {
return fitView;
}
}
// 4.如果沒有比自己合適的子控件,最合適的view就是自己
return self;
}
版權(quán)印為您的作品印上版權(quán)83135512