參考好文
iOS開發-事件傳遞響應鏈,用運行時分析
iOS事件傳遞:響應者鏈[譯]
http://www.lxweimin.com/p/ef83a798121c
圖都是搬過來總結的
總結
- 操作系統會把一系列單擊事件包裝成UITouch和UIEvent形式的實例。
事件響應鏈
圖中的都是UIResponder的子類對象。
UIResponer提供四個用戶點擊的回調方法
屏幕快照 2016-08-12 下午3.53.58.png
UIVIew中的兩個方法
- (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
上面四個方法 + 2個方法有什么聯系呢
當一個點擊事件發生時,從UIApplication開始調用pointInSide: WithEvent:
直到最低層的UIVIew,若返回YES,則調用hitTest: withEvent:
,壓入response棧,遍歷到最低層UIView后,開始出棧 (使用nextResponder)
,每pop一個檢測是否響應事件,以此下去,直到事件得到了處理或者到達AppDelegate后依舊未響應,事件被摒棄為止
屏幕快照 2016-08-12 下午4.20.33.png
屏幕快照 2016-08-12 下午4.20.53.png
響應者鏈是由一系列響應者連成的鏈
- 很多類型的事件的傳遞都依賴于響應者鏈。響應者鏈是一系列連接在一起的響應者對象。它從第一響應者(棧頂的view)開始,以application
對象結束。如果第一響應者不能處理這個事件,它會把這個事件沿著這個響應者鏈傳遞到下一個響應者。 - 一個響應者對象是一個能響應并能處理事件的對象。UIResponder類是所有響應者的父類,它定義了事件處理和常見響應者行為的通用編程接口。UIApplication,UIViewController以及UIView類的實例對象都是響應者,這表明,所有視圖和絕大多數主控制器都是響應者。需要注意的是核心動畫的圖層對象不是響應者。