美文网首页
响应链总结梳理与应用

响应链总结梳理与应用

作者: hoggenWang | 来源:发表于2018-03-19 14:52 被阅读39次

    响应链总结梳理与应用

    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];
    }
    

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

    相关文章

      网友评论

          本文标题:响应链总结梳理与应用

          本文链接:https://www.haomeiwen.com/subject/wnhpqftx.html