美文网首页
响应者链

响应者链

作者: noprkl | 来源:发表于2016-09-29 22:27 被阅读0次
什么是响应者链

在iOS的事件传递过程中需要通过多个响应者来寻找最合适的事件接收者,把这个过程中的响应者串联起来就是响应者链。

事件的产生和传递过程

当系统检测到触摸事件event发生的时候,将event放入当前活动的UIApplication事件队列中,UIApplication会从队列中取出event传递给主窗口UIWindow(keyWindow)keyWindow会通过递归找到合适的View,调用touches;

触摸事件event——>UIApplication队列——>UIWindow对列接收——>keyWindow递归找到View——>View调用合适的touches——>处理事件

递归寻找响应者 (hitTest:withEvent:和pointInside:withEvent:)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    NSLog(@"%@-hit-%@", NSStringFromClass(self.class), event);
    // 1.判断能否接受点击事件
    if (!self.userInteractionEnabled || self.alpha == 0.0 || self.hidden) {
        return nil;
    }
    // 2.判断点是否点击在当前视图上
    if (![self pointInside:point withEvent:event]) {
        return nil;
    }
    // 反向遍历子视图
    __block UIView *fitView = nil;
    [self.subviews.reverseObjectEnumerator.allObjects enumerateObjectsUsingBlock:^(UIView *childView, NSUInteger idx, BOOL * _Nonnull stop) {
        // 把当前坐标系上的点转换成子控件上的点
        CGPoint chidlPoint = [self convertPoint:point toView:childView];
        // 判断这个点上是否在子视图上,找到第一个响应视图
        fitView = [childView hitTest:chidlPoint withEvent:event];
        if (fitView) {
            *stop = YES;
        }
    }];
    if (fitView) {
        return fitView;
    }
    return self;
}
寻找合适的响应者

如果响应者处理不了touches事件,会将事件上移,该类的上一级如果是UIView,子视图处理事件,处理不了,寻找它的父视图
该类的上一级如果是UIViewController,则是由它所属的控制器处理
事件上移到最顶层如果处理不了,把事件传递给UIWindowUIWindow处理不了给UIApplicationUIApplication默认不响应,这个touches就会被吃掉

寻找当前view的UIViewController

思路:
根据响应者链寻找,找到相应当前view事件的控制器
1.给当前控制器添加一个导航条 ‘nav’ 是window的rootViewController

UIViewController *vc = ((AppDelegate *)[UIApplication sharedApplication].delegate).nav.visibleViewController;

2.通过遍历当前view的响应者链 找到 View所属的控制器

- (UIViewController *)viewController:(UIView *)view
    for (UIView *next = view; next; next = next.superview) {
        UIResponder *responder = [next nextResponder];
        if ([responder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)responder;
        }
    }
    return nil;
}

相关文章

  • iOS 响应链

    iOS开发 - 事件传递响应链iOS 响应者链,事件的传递事件传递之响应链Cocoa Touch事件处理流程--响...

  • UIKit之触摸、响应者链

    触摸 响应者链 //响应者链多个响应者组成的链//首先执行检测过程,信息先从UIApplication->Appd...

  • ios响应者链

    iOS 响应者链 字数418 阅读41 评论0 喜欢3 响应者链 响应者链是一个响应者的连接序列,事件或者动作消息...

  • 转载:响应者链工作原理

    响应者链 响应者链是由一个一个响应者组成的长链;响应者链定义了iOS中触摸事件的交互规则;如果hit-test检测...

  • iOS UI事件传递与响应者链

    iOS UI事件传递与响应者链 响应者链 响应者对象:继承自UIResponder的对象称之为响应者对象。UIAp...

  • Swift学习笔记Day0726

    响应者链: 当Application Kit在应用程序中构造对象时,会为每个窗口建立响应者链。响应者链中的基本对象...

  • 基于ResponderChain的事件传递

    ResponderChain对象交互方式本质 响应者链简介 Responder Chain也就是响应链,响应者链是...

  • 响应者链

    1.1 响应者链 当与某控件交互时,该控件将作为"第一响应者 (First Responder)",作为响应者链的...

  • iOS响应者链

    iOS响应者链

  • iOS知识收集

    1. 响应者链 1.1 Cocoa Touch事件处理流程--响应者链 1.2 事件传递之响应链 多线程 http...

网友评论

      本文标题:响应者链

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