美文网首页
iOS事件传递与响应者链

iOS事件传递与响应者链

作者: iOS程序媛ing | 来源:发表于2020-09-09 08:44 被阅读0次

什么是触摸事件

触摸事件发生后,系统会将触摸事件添加到由UIApplication管理的队列中(为什么是队列,因为队列是FIFO,先进先出,先发生的事件,优先处理),再由UIApplication向下传递给UIWindow,UIWindow继续向下传递给他的子控件,直到找到最优的控件,这个过程称之为事件传递。
学习事件传递,首先要搞清楚一个概念---触摸对象

什么是触摸对象

继承自UIResponder的都具备事件处理能力,如UIApplication、UIWindow、UIView。都可以处理事件。

如何找到最合适的view

  • 首先判断uiwindow能否处理事件
  • 触摸点是否在自己身上
  • 子控件数组从后往前遍历子控件,重复前面的两步操作(首先判断uiwindow能否处理事件,触摸点是否在自己身上)
  • 遍历子控件的子控件数组,如果没有合适的view,直到找不到合适的view
  • 如果没有符合条件的子控件,那么认为自身就是最合适的控件
控件能够处理事件需要满足三个条件
  • 隐藏:hidden是否等于YES,等于YES不能处理事件;
  • 交互能力:userInteractionEnabled是否等于No,等于NO ,不能处理事件,;
  • 透明度:控件的透明度是否<0.01,小于0.01不能处理事件;

无论控件能否处理事件,事件都会传递给控件,并调用hittest方法,

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if (self.userInteractionEnabled == NO || self.alpha < 0.01 | self.hidden == YES) {
        return nil;
    }
    if ([self pointInside:point withEvent:event] == NO) {
        return nil;
    }
//获取子控件数组
    NSArray *subViewsArray = self.subviews;
 //遍历子控件数组
    for (int i = 0; i < subViewsArray.count; i++) {
//倒序遍历子控件数组
        UIView *view = self.subviews[subViewsArray.count - 1 - I];
//将触摸点转化为子控件的触摸点
        CGPoint npoint = [self convertPoint:point toView:view];
//调用子控件的hittest方法寻找最合适的view
        UIView *fitView = [view hitTest:npoint withEvent:event];
//如果有最合适的view,返回最合适的view
        if (fitView) {
            return fitView;
        }
    }
//如果子控件中没有最合适的view,则自身就是最合适的
    return self;
}

响应者链

响应者链,顾名思义,就是由一个个响应者组成的链条,首先由最优的view向上传递,传递给下一个响应者,如果所有的响应者都不能响应事件,则事件被丢弃。
与事件传递方向正好相反,事件传递是由上向下传递,响应者链是由下向上传递。

  • 如果当前view是控制器的view,那么他的下一个响应者就是当前控制器
  • 如果当前view不是控制器的view,那么他的下一个响应者就是他的父视图

事件不响应的几种情况

  • 控件超出父控件范围
  • 子控件有相同的方法,发生事件拦截(cell上的子控件添加点击事件后,cell的点击事件将不会响应)
  • 控件或者父控件的userinterfaceennable为No,

相关文章

  • iOS 响应链

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

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

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

  • 二、事件传递链和响应者链

    iOS触摸事件详解iOS开发-事件传递响应链 响应者链 UIResponser包括了各种Touch message...

  • iOS响应者链

    参考好文 iOS开发-事件传递响应链,用运行时分析 iOS事件传递:响应者链[译] http://www.jian...

  • iOS-触摸事件传递、事件响应者链

    前言,本文简单了解触摸事件传递和事件响应者链。 一、知识点简介 1.1 iOS中的事件介绍 iOS中的事件可以分为...

  • iOS开发之触摸事件

    本文介绍了iOS中使用频率较高的触摸事件,并阐述了事件产生和传递的过程,以及响应者链的事件传递过程 触摸事件 简介...

  • iOS中事件处理机制——触摸、手势、控制

    响应者链 首先,想要理解事件的处理机制必须要知道iOS中响应者链,要明白事件是怎么传递的。 如上图,假设我们点击v...

  • iOS知识收集

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

  • iOS 事件传递与响应者链

    响应者链 参考链接 响应者对象:继承自UIResponder的对象称之为响应者对象。UIApplication、U...

  • iOS 事件传递与响应者链

    一.基本概念 UIEvent 一个UIEvent对象描述一次用户交互行为。例如:用户点击手机屏幕、摇晃手机以后,系...

网友评论

      本文标题:iOS事件传递与响应者链

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