美文网首页
iOS事件处理中响应链

iOS事件处理中响应链

作者: FY_Chao | 来源:发表于2019-11-21 18:05 被阅读0次

在App的使用过程中,事件会在App中流转来寻找适合的响应者来针对事件响应。在本篇文章中。我们来了解下事件、响应者及响应链。

响应者

首先我们来看下什么是响应者,响应者顾名思义是针对事件作出处理的对象。在 iOS 中响应者对象就是 UIResponder的实例。在 UIKit 框架中我们可以看到很多重要的对象都继承自UIResponder,包括:

  • UIApplication对象
  • UIViewController
  • 所有的UIView对象 (包括 UIWindow)。
UIResponder 继承图示

事件

App收到一个事件后, 系统会自动派发事件到合适的响应者来处理。在iOSUIEvent代表一个UIKit事件,目前UIEvent包含以下类型事件:

1. 触摸事件 touch events,最常见也是最常处理事件。
2. 运动事件 motion events,由`UIKit`触发的,与Core Motion框架息息相关。
3. 远程控制事件 remote-control events,远程控制事件允许响应者对象从外部附件或耳机接收命令,以便它可以管理音频和视频。
4. 按压事件 press events,常出现在 `game controller`, `AppleTV 遥控器, 或者其他具有物理按钮的设备交互时。

ps:以下内容皆以触摸事件 touch events为例。

在iOS中一个touch事件可能包含一个或者多个UITouch对象,如用户双指触碰屏幕,此时产生的一个触碰事件中有两个UITouch对象,每个UITouch对象对应一个手指。

而在一个触摸事件产生之后,系统会将事件传递给合适的UIResponder对象并调用相应的处理方法。在UIResponder中默认实现了响应的事件理方法,如处理touch events

- (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; // 外部打断,如电话的呼入。
touches方法调用的时间点

如何寻找到合适的View处理事件

UIKit会用Touch事件的位置与视图层次结构中视图对象的bounds进行比较。遍历视图层次结构的hitTest:withEvent:方法,查找包含触摸事件的最深子视图,该子视图成为触摸事件的第一响应者。

大概步骤:

  1. 判断Touch事件的location是否在自己bounds内。如果是进行下一步,如果不是则忽略
  2. 遍历自身的子视图,Touch事件的location是否在子视图bounds
  3. 重复第一、第二步,直到没有子视图。则自己就是

UIView不能接收触摸事件的四种情况:

  • 不允许交互:userInteractionEnabled = NO
  • 隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
  • 透明度:如果设置一个控件的透明度<0.01,会直接影响子控件的透明度。-
  • alpha:0.0~0.01为透明。
  • 父控件的 clipsToBounds = NO,子控件超出父控件的bounds。超出的控件不能接受事件

响应链

响应者接收事件数据后,必须处理事件或将其转发到另一个响应者对象。未处理的事件从响应者传递到下一个响应者,这个传递过程称之为响应链。

UIKit的传递过程中,下一个响应者由nextResponder决定,许多UIKit类已经重写此属性并返回特定的对象,如下:

  • UIView对象。
  • 如果视图是视图控制器的根视图,则下一个响应者是视图控制器;
  • 否则,下一个响应者是视图的父视图。
  • UIViewController 对象。
  • 如果UIViewControllerviewwindow的根视图(rootViewController),则下一个响应者是window对象。
  • 如果视图控制器是由另一个视图控制器presented的,则下一个响应者是presentingViewController
  • UIWindow对象的下一个响应者是UIApplication对象。
  • UIApplication对象的下一响应者是 AppDelegate,当且AppDelegateUIResponder对象,且不能是viewview controllerapp本身。
响应链图示

相关文章

  • iOS 响应链

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

  • iOS事件的响应者链

    iOS 事件响应者链 1 iOS中的事件 触摸事件 加速计事件 远程控制事件 在iOS中不是任何对象都能处理事件,...

  • 响应链

    iOS事件响应链中Hit-Test View的应用从iOS的事件响应链看TableView为什么不响应touche...

  • iOS基础篇-事件处理

    1、首先需要理解iOS事件处理机制 理解事件处理、响应者、响应者链概念https://developer.appl...

  • iOS事件处理中响应链

    在App的使用过程中,事件会在App中流转来寻找适合的响应者来针对事件响应。在本篇文章中。我们来了解下事件、响应者...

  • iOS 响应者链

    一个目前最新最全的分析 iOS事件处理,看我就够了~ 对响应者链机制的图文分析 深入浅出iOS事件机制 对响应者链...

  • 深入浅出iOS事件机制

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

  • iOS中手势的简述(面试必备)

    提供了有关iOS中手势常用到的6个方面(事件、事件处理的方法、UITouch触摸对象、事件传递、响应者链、手势识别...

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

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

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

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

网友评论

      本文标题:iOS事件处理中响应链

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