參考好文
iOS開發(fā)-事件傳遞響應(yīng)鏈舒岸,用運(yùn)行時(shí)分析
iOS事件傳遞:響應(yīng)者鏈[譯]
http://www.reibang.com/p/ef83a798121c
圖都是搬過來總結(jié)的
總結(jié)
- 操作系統(tǒng)會(huì)把一系列單擊事件包裝成UITouch和UIEvent形式的實(shí)例鲸阻。
事件響應(yīng)鏈
圖中的都是UIResponder的子類對(duì)象。
UIResponer提供四個(gè)用戶點(diǎn)擊的回調(diào)方法
屏幕快照 2016-08-12 下午3.53.58.png
UIVIew中的兩個(gè)方法
- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system
- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds
上面四個(gè)方法 + 2個(gè)方法有什么聯(lián)系呢
當(dāng)一個(gè)點(diǎn)擊事件發(fā)生時(shí)讽营,從UIApplication開始調(diào)用pointInSide: WithEvent:
直到最低層的UIVIew,若返回YES,則調(diào)用hitTest: withEvent:
宦芦,壓入response棧,遍歷到最低層UIView后,開始出棧 (使用nextResponder)
,每pop一個(gè)檢測是否響應(yīng)事件轴脐,以此下去调卑,直到事件得到了處理或者到達(dá)AppDelegate后依舊未響應(yīng),事件被摒棄為止
屏幕快照 2016-08-12 下午4.20.33.png
屏幕快照 2016-08-12 下午4.20.53.png
響應(yīng)者鏈?zhǔn)怯梢幌盗许憫?yīng)者連成的鏈
- 很多類型的事件的傳遞都依賴于響應(yīng)者鏈大咱。響應(yīng)者鏈?zhǔn)且幌盗羞B接在一起的響應(yīng)者對(duì)象恬涧。它從第一響應(yīng)者(棧頂?shù)膙iew)開始,以application
對(duì)象結(jié)束碴巾。如果第一響應(yīng)者不能處理這個(gè)事件溯捆,它會(huì)把這個(gè)事件沿著這個(gè)響應(yīng)者鏈傳遞到下一個(gè)響應(yīng)者。 - 一個(gè)響應(yīng)者對(duì)象是一個(gè)能響應(yīng)并能處理事件的對(duì)象厦瓢。UIResponder類是所有響應(yīng)者的父類现使,它定義了事件處理和常見響應(yīng)者行為的通用編程接口。UIApplication旷痕,UIViewController以及UIView類的實(shí)例對(duì)象都是響應(yīng)者碳锈,這表明,所有視圖和絕大多數(shù)主控制器都是響應(yīng)者欺抗。需要注意的是核心動(dòng)畫的圖層對(duì)象不是響應(yīng)者售碳。