响应链总结梳理与应用

响应链总结梳理与应用

App使用响应者对象接收和处理事件,响应者对象是任何UIResponder的实例。UIResponder的子类包括UIView,UIViewController,UIApplication等。响应者接收到原始事件数据,必须处理事件或者转发到另一个响应者对象。当你的App接收到一个事件时,UIKit自动引导事件到最合适的响应者对象,也叫做第一响应者。

响应链

- (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

一个是根据点击坐标返回事件是否发生在本视图以内,另一个方法是返回响应点击事件的对象。
系统先调用pointInSide: WithEvent:判断当前视图以及这些视图的子视图是否能接收这次点击事件,然后在调用hitTest: withEvent:依次获取处理这个事件的所有视图对象,在获取所有的可处理事件对象后,开始调用这些对象的touches回调方法

第一个过程是建立响应链的过程,将可以响应该事件的对象找出来,UIApplication对象维护着自己的一个响应者栈,当pointInSide: withEvent:返回yes的时候,响应者入栈。

响应者栈(图片来源于网络).png

栈顶的响应者作为最优先处理事件的对象,假设最顶层的响应者不处理事件,那么出栈,移交给下一个响应者,以此下去,直到事件得到了处理或者到达AppDelegate后依旧未响应,事件被摒弃为止。

不规则图形中的应用

利用下面的方法可以控制响应视图的响应范围

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

在响应方法中做出响应的判断,返回true 表示响应该点击事件

利用响应链传参

利用响应链UIResponder (Extension)可以使用路由的方式将相关的相应由路由方式将信息传递下去,从而简化程序设计的复杂结构

- (void)routerEventWithName:(NSString *)eventName userInfo:(NSDictionary *)userInfo {
    //NSLog(@"%@",NSStringFromClass([self class]));
    //顺着相应链传递
    [[self nextResponder] routerEventWithName:eventName userInfo:userInfo];
}

在需要的响应者中重写这个方法即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 58,046评论 51 603
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 6,133评论 4 26
  • 在开发过程中,大家或多或少的都会碰到令人头疼的手势冲突问题,正好前两天碰到一个类似的bug,于是借着这个机会了解了...
    闫仕伟阅读 5,421评论 2 23
  • 用户以多种方式操纵他们的iOS设备,例如触摸屏幕或摇动设备。 iOS会解释用户何时以及如何操作硬件并将此信息传递到...
    坤坤同学阅读 4,036评论 7 19
  • 史上最详细的iOS之事件的传递和响应机制-原理篇http://www.jianshu.com/p/2e074db7...
    Chris_C阅读 1,440评论 0 8