事件的響應鏈涉及到的一些概念
-
UIResponder類,是UIKIT中一個用於處理事件響應的基類。窗又上的所有事件觸發,都由該類響應(即事件處理入又)。所以,窗又上的View及控制器都是 派生於該類的,例如UIView、UIViewController等。
-
調用UIResponder類提供的方法或屬性,我們就可以捕捉到窗又上的所有響應 事件,並進行處理。
-
響應者鏈條是由多個響應者對象連接起來的鏈條,其中響應者對象是能處理事 件的對象,所有的View和ViewController都是響應者對象,利用響應者鏈條能 讓多個控件處理同一個觸摸事件.
如上圖,響應者鏈有以下特點:
響應者鏈通常是由 initial view 開始;
-
UIView 的 nextResponder 它的 superview;如果 UIView 已經是其所在的 UIViewController 的 top view,那么 UIView 的 nextResponder 就是 UIViewController;
-
UIViewController 如果有 Super ViewController,那么它的 nextResponder 為其 Super ViewController 最表層的 View;如果沒有,那么它的 nextResponder 就是 UIWindow;
-
UIWindow 的 contentView 指向 UIApplication,將其作為 nextResponder;
-
UIApplication 是 個響應者鏈的終點,它的 nextResponder 指向nil,整個
responder chain 結束。
Hit-Test View 與 Hit-Testing
假設用戶觸摸了上圖的 View E 區域,那么 iOS 將會按下面的順序反復檢測 subview 來尋找 Hit-Test View
-
觸摸區域在視圖 A 內,所以檢測視圖 A 的 subview B 和 C;
-
觸摸區域不在視圖 B 內,但是在視圖 C 內,所以檢查視圖 C 的 subview D 和 E;
-
觸摸區域不在視圖 D 內,在視圖 E 中;
視圖 E 在整個視圖體系中是 lowest view,所以視圖 E 就是 Hit-Test View 。
事件的鏈有兩條:事件的響應鏈;Hit-Testing 時事件的傳遞鏈。
-
響應鏈:由離 戶最近的view向系統傳遞。 initial view –> super view –> .....–> view controller –> window –> Application –> AppDelegate
-
Hit-Testing 鏈:由系統向離 戶最近的view傳遞。 UIKit –> active app's event queue –> window –> root view –>......–>lowest view