美文网首页
Responder Chain - 响应链

Responder Chain - 响应链

作者: 呆萌的中指 | 来源:发表于2018-07-19 18:44 被阅读0次

响应链

响应链由一个个UIResponder的子类构成的,UIResponder是系统一个负责接受和处理事件的类。

一般情况下,一条响应链开始于第一响应者,结束于application对象。
那么是如何确定第一响应者的?

响应链的工作原理

拿我们平常点击某一应用的按钮并跳转到另一个页面为例,这其中对事件的处理分为两步:

1、事件的传递,找到第一响应者。
2、事件的响应,由第一响应者处理事件,执行跳转到另一页。

1、 事件的传递分发流程:

1.点击时会产生事件UIEvent并存入UIApplication中的事件队列中, 并且在整个视图结构中自上而下的进行分发

2.UIWindow接受到事件开始进行最优响应视图查询的过程。

3.当到UIViewController这一层时同样对其根视图(self.view及其上subviews)开始最优响应视图查询。

事件分发顺序

该过程会调用UIView的两个方法,判断点击的位置是否在当前视图上。

//判断当前点击事件的最优响应者,也是第一响应者。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
//判断当前点击是否在视图内
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

流程如下:

1.调用hitTest方法进行最优响应视图查询,以上三种情况会使该方法返回nil,即当前视图下无最优响应视图

hidden = YES
userInteractionEnabled = NO
alpha < 0.01

2.hitTest方法内部会调用pointInside方法对点击点进行是否在当前视图bounds内进行判断,如果超出bounds,hitTest则返回nil,未超出范围则进行步骤3

3.对当前视图下的subviews采取逆序上述1 2步骤查询最优响应视图。如果hitTest返回了对应视图则说明在当前视图层级下有最优响应视图。

下面是最优命响应图查询代码示例:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    
    if (self.alpha < 0.01 || !self.userInteractionEnabled || self.hidden) {
        
        return nil;
    }
    
    if (![self pointInside:point withEvent:event]) {
        
        return nil;
    }
    
    __block UIView *hitView = nil;
    [self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull subview, NSUInteger idx, BOOL * _Nonnull stop) {
        
        hitView = [subview hitTest:point withEvent:event];
        if (hitView) {
            
            *stop = YES;
        }
    }];
    
    return hitView ? : self;
}

事件的分发要点:

1、 UIApplication开始自上而下的进行事件分发
2、 UIView内部开始反向遍历查找最优视图

2、事件的响应流程

引用下苹果官方文档中的一张图

1.判断最优响应视图能否响应事件,如果视图能进行响应则事件在响应链中的传递终止。如果视图不能响应则将事件传递给 nextResponder也就是通常的superview进行事件响应

2.如果事件继续上报至UIWindow并且无法响应,它将会把事件继续上报给UIApplication

3.如果事件继续上报至UIApplication并且也无法响应,它将会将事件上报给其Delegate,但前提下这个Delegate不属于 响应链 并且是UIResponder的子类

4.如果最终事件依旧未被响应则会被系统抛弃

事件响应要点:

事件响应自下而上进行上报

相关文章

  • 响应链相关知识点

    术语 hit-testing 点击检测 responder chain 响应链 响应链可以做...

  • iOS 响应者链 整理

    一、响应者链(Responder Chain) 先来说说响应者对象(Responder Object),顾名思义,...

  • 基于ResponderChain的事件传递

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

  • 响应链(四)

    Altering the Responder Chain 变更响应链 You can alter the resp...

  • iOS 响应者链 在View中实现页面跳转

    响应者链(Responder Chain) (1)响应者对象(response Object)指的是有响应和处理”...

  • Responder Chain - 响应链

    响应链 响应链由一个个UIResponder的子类构成的,UIResponder是系统一个负责接受和处理事件的类。...

  • 40道iOS面试问题总结

    1. 搞清楚touch事件的传递(事件的响应链) 事件的响应(responder chain) 只有继承了UIRe...

  • UIResponder-(学习整理)

    参考文件 UIResponder iOS编程中的快递小哥-Responder Chain(响应链) 史上最详细的i...

  • iOS 响应者链

    概述 iOS 响应者链(Responder Chain) 是支持App界面交互的重要基础, 点击, 滑动, 旋转,...

  • 响应者链(Responder Chain)

    响应者链条主要分为两部分:事件的传递链条和事件的响应链条。 1、事件的传递链条: 当屏幕发生触摸事件后,系统会将事...

网友评论

      本文标题:Responder Chain - 响应链

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