千家信息网

分析iOS中事件的响应链和传递链

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"分析iOS中事件的响应链和传递链",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"分析iOS中事件的响应链和传递链"吧!iOS事件链有两条:
千家信息网最后更新 2026年11月03日分析iOS中事件的响应链和传递链

本篇内容主要讲解"分析iOS中事件的响应链和传递链",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"分析iOS中事件的响应链和传递链"吧!

iOS事件链有两条:事件的响应链;Hit-Testing事件的传递链

  1. 响应链:由离用户最近的view向系统传递。initial view -> super view -> ….. -> view controller -> window -> Application -> AppDelegate传递链:由系统向离用户最近的view传递。UIKit -> active app's event queue -> window -> root view -> …… -> lowest view

在iOS中只有继承UIResponder的对象才能够接收并处理事件,UIResponder是所有响应对象的基类,在UIResponder类中定义了处理上述各种事件的接口。我们熟悉的UIApplication、UIViewController、UIWindow和所有继承自UIView的UIKit类都直接或间接的继承自UIResponder,所以它们的实例都是可以构成响应者链的响应者对象,首先我们通过一张图来简单了解一下事件的传递以及响应

1.传递链

事件传递的两个核心方法

- (nullable UIView *)hitTest:(CGPoint)point withEvent:(nullable UIEvent *)event; // recursively calls -pointInside:withEvent:. point is in the receiver's coordinate system- (BOOL)pointInside:(CGPoint)point withEvent:(nullable UIEvent *)event; // default returns YES if point is in bounds

第一个方法返回的是一个UIView,是用来寻找最终哪一个视图来响应这个事件

第二个方法是用来判断某一个点击的位置是否在视图范围内,如果在就返回YES

其中UIView不接受事件处理的情况有

1. alpha <0.012. userInteractionEnabled = NO3. hidden = YES

事件传递的流程图

流程描述

我们点击屏幕产生触摸事件,系统将这个事件加入到一个由UIApplication管理的事件队列中,UIApplication会从消息队列里取事件分发下去,首先传给UIWindow在UIWindow中就会调用hitTest:withEvent:方法去返回一个最终响应的视图在hitTest:withEvent:方法中就会去调用pointInside: withEvent:去判断当前点击的point是否在UIWindow范围内,如果是的话,就会去遍历它的子视图来查找最终响应的子视图遍历的方式是使用倒序的方式来遍历子视图,也就是说最后添加的子视图会最先遍历,在每一个视图中都回去调用它的hitTest:withEvent:方法,可以理解为是一个递归调用最终会返回一个响应视图,如果返回视图有值,那么这个视图就作为最终响应视图,结束整个事件传递;如果没有值,那么就会将UIWindow作为响应者

2.响应链

响应者链流程图

响应者链的事件传递过程总结如下

如果view的控制器存在,就传递给控制器处理;如果控制器不存在,则传递给它的父视图在视图层次结构的最顶层,如果也不能处理收到的事件,则将事件传递给UIWindow对象进行处理如果UIWindow对象也不处理,则将事件传递给UIApplication对象如果UIApplication也不能处理该事件,则将该事件丢弃

实例场景

在一个方形按钮中点击中间的圆形区域有效,而点击四角无效

核心思想是在pointInside: withEvent:方法中修改对应的区域

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // 如果控件不允许与用用户交互,那么返回nil if (!self.userInteractionEnabled || [self isHidden] || self.alpha <= 0.01) { return nil; } //判断当前视图是否在点击范围内 if ([self pointInside:point withEvent:event]) { //遍历当前对象的子视图(倒序) __block UIView *hit = nil; [self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { //坐标转换,把当前坐标系上的点转换成子控件坐标系上的点 CGPoint convertPoint = [self convertPoint:point toView:obj]; //调用子视图的hitTest方法,判断自己的子控件是不是最适合的View hit = [obj hitTest:convertPoint withEvent:event]; //如果找到了就停止遍历 if (hit) *stop = YES; }]; //返回当前的视图对象 return hit?hit:self; }else { return nil; }}// 该方法判断触摸点是否在控件身上,是则返回YES,否则返回NO,point参数必须是方法调用者的坐标系- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { CGFloat x1 = point.x; CGFloat y1 = point.y; CGFloat x2 = self.frame.size.width / 2; CGFloat y2 = self.frame.size.height / 2; //判断是否在圆形区域内 double dis = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); if (dis <= self.frame.size.width / 2) { return YES; } else{ return NO; }}

到此,相信大家对"分析iOS中事件的响应链和传递链"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

事件 视图 方法 对象 处理 响应者 坐标 控件 分析 区域 坐标系 控制器 流程 用户 系统 范围 控制 倒序 内容 圆形 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司 互联网科技园 广东万易互联网科技有限公司惠州分公司 上海喔噻互联网科技 广州善班互联网科技 郑州华宇互联网科技 天扬科技互联网广告 互联网科技大会案例 蓝色互联网科技 温州喔噻互联网科技有限公司 中国的互联网科技企业的崛起 宁夏众和广鑫互联网科技有限公司 银川新华互联网科技学校联系电话 本届互联网博览会上的黑科技 晋城互联网科技 黑云互联网科技有限公司 互联网营销推广黑科技 广州互联网高科技取餐柜 东营紫格互联网科技 北京互联网科技类企业分布 富国互联网科技创新基金 恒银科技与互联网金融 阿里巴巴算科技企业还是互联网 剑昆互联网络科技有限公司临桂 互联网大会黑科技排名 岳阳华臻互联网科技有限公司 阿里互联网科技企业 锡山区互联网智能科技产品供应 南京一网一红互联网科技有限公司 亚光科技低轨卫星互联网
0