事件傳遞:
1.首先 UIApplication 獲取事件存放到事件隊(duì)列中骂租,因?yàn)槭录?duì)列是先進(jìn)先出走净,不能放到棧內(nèi)(棧是一個(gè)整體連續(xù)的內(nèi)存,先進(jìn)去被壓到棧底了)所以是先進(jìn)后出多糠。
2.UIApplication 把事件傳給UIWindown ,UIWindown 通過
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
和 - (Bool)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
通過遍歷subViews尋找合適的子控件浩考;
3.找到正確合適的子控件之后讓子控件處理事件夹孔,還會(huì)繼續(xù)往下傳遞:直到全部尋找完為止。
特別注意點(diǎn):如果父視圖不合適析孽,自視圖一定不合適(子視圖的frame 超出父視圖搭伤,此時(shí)點(diǎn)擊子視圖,父視圖的傳遞鏈會(huì)被斷掉袜瞬,原因就是因?yàn)?/p>
- (Bool)pointInside:(CGPoint)point withEvent:(UIEvent *)event 判斷返回為NO怜俐。
事件響應(yīng)機(jī)制:恰恰與傳遞相反,從最上層的響應(yīng)對(duì)象開始調(diào)用
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ?{
NSLog(@“做自己的事情”);
[super touchesBegan:touches withEvent:event];傳給父類讓父類繼續(xù)做事情邓尤。
如果只要當(dāng)前類響應(yīng)拍鲤,那么不調(diào)用父類方法,這樣響應(yīng)鏈也就斷掉了汞扎。
}
處理完當(dāng)前對(duì)象的事件之后可以調(diào)用?[super touchesBegan:touches withEvent:event]; 把事件響應(yīng)傳給下一個(gè)響應(yīng)者(一般情況來說季稳,父視圖就是子視圖的下一個(gè)響應(yīng)者,如果是ViewController 那么 vc的view的響應(yīng)者就是VC 比較特殊)澈魄。
參考他人鏈接總結(jié)一些自己的理解,如果錯(cuò)誤請(qǐng)指正景鼠,大神勿噴!
原文鏈接 :http://www.reibang.com/p/8dca02b4687e