iOS響應者鏈

weixin_34107955發表於2018-10-18

每一個繼承於UIResponder都是一個點,通過nextResponder來進行指向

其指向規則是:

UIView

如果 view 是一個 view controller 的 root view,nextResponder 是這個 view controller.

如果 view 不是 view controller 的 root view,nextResponder 則是這個 view 的 superview

UIViewController

如果 view controller 的 view 是 window 的 root view, view controller 的 nextResponder 是這個 window

如果 view controller 是被其他 view controller presented調起來的,那麼 view controller 的 nextResponder 就是發起調起的那個 view controller

UIWindow

window 的 nextResponder 是 UIApplication 物件.

UIApplication

UIApplication 物件的 nextResponder 是 app delegate, 但是 app delegate 必須是 UIResponder 物件,並且不能使 view ,view controller 或  UIApplication 物件他本身.

 那麼響應鏈是如何工作,正確找到應該響應該事件的響應者的?

說白了就是,當有touch事件來的時候,會從最下面的檢視開始執行 hitTest:withEvent: ,如果符合成為響應者的條件,就會繼續遍歷它的 subviews 繼續執行 hitTest:withEvent: ,直到找到最合適的view成為響應者。這裡要注意幾個點:

符合響應者的條件包括

touch事件的位置在響應者區域內

響應者 hidden 屬性不為 YES

響應者 透明度 不是 0

響應者 userInteractionEnabled 不為 NO

遍歷 subview 時,是從上往下順序遍歷的,即 view.subviews 的 lastObject 到 firstObject 的順序,找到合適的響應者view,即停止遍歷.

相關文章