iOS 事件響應和傳遞 總結

事件傳遞:

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容