一直在写代码,忙忙碌碌却碌碌无为,所以最近想稍微沉淀一下,补充一下自己的理论基础,先从最常用的响应链开始吧。。。
一、如何理解iOS的响应链?
第一要明确的是能够接受和处理事件的响应者都是UIResponder的实例,包括UIView,UIViewController,UIApplication等。UILayer不包括在其中。
第一响应者由UIKit指定,当然根绝事件类型有所变化
Touch event
-
第一响应者是触摸事件产生的view
-
Press event
第一响应者是焦点响应者。
-
Shake-motion events,Remote-control events,Editing menu messages
第一响应者是你或者UIKit指定的对象。
响应分两部分,第一,UIKit如何找到第一个响应者? 第二,响应链如何传递
找到第一响应者
UIKit使用基于视图的hit-testing来确定Touch事件在哪里产生。
UIView的hitTest:withEvent:方法在视图层级中执行,寻找最深的包含指定Touch的子视图,这个视图将成为Touch事件的第一响应者。
该方法会调用子视图poiotInside:withEvent:方法来确定哪个子视图来响应该touch
简单理解起来就是从最底层开始遍历自己的子视图能否响应,直到找到最深一层的视图,当然会有一些边界判断,如果不在边界内,其所有子视图都忽略了,如果view不能响应其子视图当然也就全忽略了。
UIView 在一下三种情况下是不能响应事件的
-
hidden = YES
-
userInteractionEnabled = NO
-
alpha < 0.01
响应链传递
这是官方给的默认响应链,由UIKit默认实现,当然你也可以改变属性来改变响应链
nextResponder该属性修改可以改变响应链,改变以后下个响应者就是自己定义的了
有些已经又UIKit默认实现了
比如UIViewController的view 的下一个响应者就是controller,window的rootViewController 下一个响应者就是window,window的下一个响应者为UIApplication,application的下一个响应者是apdelegate。