事件傳遞:
1.首先 UIApplication 獲取事件存放到事件隊列中,因為事件隊列是先進先出,不能放到棧內(棧是一個整體連續的內存,先進去被壓到棧底了)所以是先進后出。
2.UIApplication 把事件傳給UIWindown ,UIWindown 通過
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
和 - (Bool)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
通過遍歷subViews尋找合適的子控件;
3.找到正確合適的子控件之后讓子控件處理事件,還會繼續往下傳遞:直到全部尋找完為止。
特別注意點:如果父視圖不合適,自視圖一定不合適(子視圖的frame 超出父視圖,此時點擊子視圖,父視圖的傳遞鏈會被斷掉,原因就是因為
- (Bool)pointInside:(CGPoint)point withEvent:(UIEvent *)event 判斷返回為NO。
事件響應機制:恰恰與傳遞相反,從最上層的響應對象開始調用
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event ?{
NSLog(@“做自己的事情”);
[super touchesBegan:touches withEvent:event];傳給父類讓父類繼續做事情。
如果只要當前類響應,那么不調用父類方法,這樣響應鏈也就斷掉了。
}
處理完當前對象的事件之后可以調用?[super touchesBegan:touches withEvent:event]; 把事件響應傳給下一個響應者(一般情況來說,父視圖就是子視圖的下一個響應者,如果是ViewController 那么 vc的view的響應者就是VC 比較特殊)。
參考他人鏈接總結一些自己的理解,如果錯誤請指正,大神勿噴!
原文鏈接 :http://www.lxweimin.com/p/8dca02b4687e