iOS响应者链

每一个继承于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,即停止遍历.

你可能感兴趣的:(iOS响应者链)