美文网首页工作生活
iOS事件传递响应机制

iOS事件传递响应机制

作者: 山有木枝壮 | 来源:发表于2019-07-01 20:20 被阅读0次

iOS系统架构一共分为四层,分别是Cocoa Touch层(触摸层)、Media(媒体层)、Core Service(媒体服务器层)和Core OS(核心操作系统层) ,我们常用的UIKit组件就是位于Cocoa Touch层。

事件传递与响应是分不开的,用户点击屏幕之后产生事件,最终由某个view捕获,并且经过响应链进行响应。

如下图


事件的传递

事件传递主要有两个方法决定某个view是不是该事件的响应者。
1、hitTest方法

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

该方法主要用递归的方式从后向前遍历加入到视图中的view
2、pointInside方法
用来判断点击事件是否在某个view上

遍历视图中所有view及其子view,经过hitTest和pointInside方法,就可以找出响应该事件的view。
通过pointInside方法,我们可以很轻松的扩大button的点击区域

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    NSLog(@"%s", __func__);
    //扩大它的响应范围
    CGRect frame = [self getScaleFrame];
    return CGRectContainsPoint(frame, point);
    
   //  return [super pointInside:point withEvent:event];
}

- (CGRect)getScaleFrame {
    CGRect rect = self.bounds;
    if (rect.size.width < 40.f) {
        rect.origin.x -= (40-rect.size.width)/2;
    }
    if (rect.size.height < 40.f) {
        rect.origin.y -= (40-rect.size.height)/2;
    }
    rect.size.width = 40.f;
    rect.size.height = 40.f;
    return rect;
}

整个事件传递机制步骤如下:
1、点击屏幕,产生触摸事件之后,放入UIApplication的队列中。
2、从队列中取出最前面的事件,传递给keyWindow,从父控件传递到子控件
3、寻找最合适的view(怎样找?)

  • 判断控件(keyWindow)是否能够处理
  • 判断触摸点是否在自己身上
  • 遍历子控件,重复上面两个步骤
  • 找到对应view,从后往前遍历view(因为后加入的子空间处理事件的机会大,最上层的响应),知道没有更合适的view
  • 没有更合适的子控件,就自己处理这个事件
通过上面的步骤,我们只是找到可以可以响应该事件的视图,那么视图是如何一步一步通过响应链传递的?
响应者链

响应者对象:能处理事件的对象,也就是继承自UIResponder的对象
作用:能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理。

如何判断上一个响应者

1> 如果当前这个view是控制器的view,那么控制器就是上一个响应者
2> 如果当前这个view不是控制器的view,那么父控件就是上一个响应者

响应者链的事件传递过程:

1>如果当前view是控制器的view,那么控制器就是上一个响应者,事件就传递给控制器;如果当前view不是控制器的view,那么父视图就是当前view的上一个响应者,事件就传递给它的父视图
2>在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理
3>如果window对象也不处理,则其将事件或消息传递给UIApplication对象
4>如果UIApplication也不能处理该事件或消息,则将其丢弃

补充

事件在整个iOS系统架构的传递


事件流程图

参考:
1、事件响应原理
2、iOS事件传递和响应机制

相关文章

  • 深入浅出iOS事件机制

    深入浅出iOS事件机制事件传递:响应链事件传递响应链

  • 初识iOS事情处理机制

    参考:史上最详细的iOS之事件的传递和响应机制-原理篇iOS触摸事件全家桶史上最详细的iOS之事件的传递和响应机制...

  • iOS之事件的传递和响应机制

    iOS之事件的传递和响应机制

  • iOS事件传递和视图响应

    iOS事件响应机制的事件传递流程 - (UIView *)hitTest:(CGPoint)point withE...

  • ios 事件传递和响应

    史上最详细的iOS之事件的传递和响应机制-原理篇iOS触摸事件传递响应之被忽视的手势识别器工作原理手势事件中can...

  • 01进阶之路-UI视图

    1. 事件传递机制和响应者链条 学习链接 事件传递机制iOS中的事件可以分为3大类型 1 触摸事件 2 加速计...

  • iOS 响应链

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

  • 响应者链

    史上最详细的iOS之事件的传递和响应机制Event Delivery: The Responder Chain

  • 事件传递和响应机制

    iOS 事件传递和响应机制 一.概述 APPs通过responder objects来接收和处理点击事件,resp...

  • iOS事件传递响应机制

    iOS系统架构一共分为四层,分别是Cocoa Touch层(触摸层)、Media(媒体层)、Core Servic...

网友评论

    本文标题:iOS事件传递响应机制

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