美文网首页程序员
iOS事件的传递和响应机制

iOS事件的传递和响应机制

作者: 朝雨晚风 | 来源:发表于2017-09-06 14:59 被阅读80次

(一)、响应者对象—— UIResponder

在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接受并处理事件,我们称之为“响应者对象”。以下都是继承自UIResponder的,所以都能接收并处理事件。

@interface UIApplication : UIResponder
@interface UIViewController : UIResponder 
@interface UIView : UIResponder 

那么为什么继承自UIResponder的类就能够接收并处理事件呢?
因为UIResponder中提供了以下4个对象方法来处理触摸事件

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

(二)、事件的传递

  1. 点击一个UIView或产生一个触摸事件A,这个触摸事件A会被添加到由UIApplication管理的事件队列中(即,首先接收到事件的是UIApplication)。
  2. UIApplication会从事件对列中取出最前面的事件A(队列按照先进先出的原则),把事件A传递给应用程序的主窗口(keyWindow)。
  3. 窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。
事件传递示例图

注*:UIView不能接收触摸事件的三种情况:
不允许交互:userInteractionEnabled = NO(UIImageView默认不能接受触摸事件,即userInteractionEnabled = NO)
隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
透明度:如果设置一个控件的透明度<0.01,会直接影响子控件的透明度。alpha:0.0~0.01为透明。

如何寻找最合适的view的底层原理

  • 事件传递给一个控件,不管这个控件能不能处理事件,也不管触摸点在不在这个控件上,事件都会先传递给这个控件;
  • 这个控件就会调用他自己的hitTest:withEvent:方法,
  • hit:withEvent:方法底层会调用pointInside:withEvent:方法
  • pointInside:withEvent:方法判断点在不在方法调用者的坐标系上。
  • 如果返回YES,代表点在方法调用者的坐标系上;返回NO代表点不在方法调用者的坐标系上。

(三)、事件的响应

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

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

(四)、触摸事件的传递和响应整体过程

  1. 用户点击屏幕后产生的一个触摸事件,经过一系列的传递过程后,会找到最合适的视图控件来处理这个事件;
  2. 找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理touchesBegan、touchesMoved、touchedEnded…
  3. 这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理。

参考文章:
史上最详细的iOS之事件的传递和响应机制-原理篇

相关文章

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

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

  • 初识iOS事情处理机制

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

  • 深入浅出iOS事件机制

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

  • ios 事件传递和响应

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

  • 01进阶之路-UI视图

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

  • iOS事件传递和视图响应

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

  • 响应者链

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

  • 事件传递和响应机制

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

  • iOS 响应链

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

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

    这里主要讲解记录下用户触摸点击手机屏幕后产生的事件是如何派发传递的,如何查找到适合响应事件的第一响应者控件,以及找...

网友评论

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

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