一憋肖、事件的傳遞過程
1.用戶點(diǎn)擊屏幕,產(chǎn)生一個(gè)UIEvent(觸摸事件)對(duì)象
2.UIApplication最先接收到這個(gè)事件胰苏,并且把這個(gè)事件添加到一個(gè)事件隊(duì)列中
3.UIApplication會(huì)將事件隊(duì)列中的所有事件按順序取出來(lái)進(jìn)行傳遞和處理
4.UIApplication首先會(huì)將事件對(duì)象傳遞給app的主窗口
5.由主窗口找出最合適的UIView來(lái)處理這個(gè)事件
6.下面這些情況的UIView都是不能接收和處理事件的
1> userInteractionEnabled = NO;
2> hidden = YES;
3> alpha = 0~0.01
7.當(dāng)事件傳遞到控制器的View時(shí):
1> 如果控制器的view不能接收事件硕蛹,事件傳遞到此結(jié)束
2> 如果控制器的view能接收事件,就判斷觸摸點(diǎn)在不在控制器的view上面
(1)如果觸摸點(diǎn)不在控制器的view上面硕并,事件傳遞到此結(jié)束
(2)如果觸摸點(diǎn)在控制器的view上面法焰,就(反序)遍歷控制器的view的所有子控件
* 如果這個(gè)子控件不能處理事件,continue倔毙,遍歷下一個(gè)子控件
* 如果這個(gè)子控件能處理事件埃仪,判斷觸摸點(diǎn)在不在這個(gè)子控件上面
# 如果觸摸點(diǎn)不在這個(gè)子控件上面,continue陕赃,遍歷下一個(gè)子控件
# 如果觸摸點(diǎn)在這個(gè)子控件上面卵蛉,再次遍歷它的子控件,重復(fù)前面(2)的過程
3> 如果找不到合適的子控件來(lái)處理這個(gè)事件么库,就交給控件本身來(lái)處理這個(gè)事件
4> 大體來(lái)說傻丝, 就是先判斷能不能處理事件,再判斷觸摸點(diǎn)在不在當(dāng)前控件范圍內(nèi)
5> 找到最合適的子控件后诉儒,就讓這個(gè)子控件來(lái)處理事件:
調(diào)用子控件的touchesBegan等方法進(jìn)行處理
8.super的touchesBegan方法的處理過程
1> super會(huì)將UIEvent(事件)對(duì)象往回傳
2> 將事件傳遞給自己的nextResponder葡缰,nextResponder就有資格處理事件
(就有機(jī)會(huì)調(diào)用nextResponder的touchesBegan方法)
3> 如果當(dāng)前響應(yīng)者對(duì)象沒有調(diào)用super的touchesBegan方法,那么事件就到此為止
4> 如果當(dāng)前view不是控制器的view允睹,直接傳回給superview
如果當(dāng)前view是控制器的view运准,直接傳回給控制器
9.事件的傳遞過程
// - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
1> UIApplication -> UIWindow *window;
UIView *hitTestView = [window hitTest:point withEvent:envent];
10.事件的完整傳遞和處理過程
1> 用戶點(diǎn)擊屏幕,產(chǎn)生一個(gè)UIEvnent *evt對(duì)象缭受,并且產(chǎn)生一個(gè)觸摸點(diǎn)CGPoint point;,由UIApplication接收這個(gè)事件
2> UIApplication會(huì)調(diào)用
UIView *myview = [window hitTest:point widthEvent:evt];
用來(lái)獲取最先處理觸摸事件的UIView
3> 讓myview處理這個(gè)觸摸事件该互,調(diào)用myview的touchesBegan等方法