文档章节

事件响应者链

杭城小刘
 杭城小刘
发布于 2017/10/13 17:04
字数 621
阅读 5
收藏 0

实验1:

定义 BaseView,在里面实现方法touchBegan,监听当前哪个类调用了该方法。

在控制器的界面上加5个颜色不同的view,每个view自定义view去实现,因此在不同的view上的手势就可以由不同的view拦截到。

UI效果图

//BaseView
#import "BaseView.h"

@implementation BaseView
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
NSLog(@"%@",[self class]);
}

结果:点击不同的View打印出不同的类名。

结论:

  • 触摸事件是从父控件传递到子控件的。
  • 点击了绿色(图上的2级)的view:UIApplication-> UIWindow -> UIViewController的view -> 绿色的view
  • 点击了蓝色(图上的3级)的view:UIApplication-> UIWindow -> UIViewController的view -> 红棕色的view -> 蓝色的view
  • 点击了黄色(图上的4级)的view:UIApplication -> UIWindow -> UIViewController的view -> 红棕色的view -> 蓝色的view -> 黄色的view

注意:如果父控件不能接收触摸事件,那么这个父控件的子控件也不能接收触摸事件

如何找到最合适的控件来接收触摸事件?

  • 自己能否接收触摸事件?
  • 触摸点是否在自己身上?
  • 从后往前遍历子控件,重复前面2个步骤
  • 如果没有符合条件的子控件,那么就自己最适合处理

事件响应原理

产生的touch方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者处理。

响应者链条

响应者链条

事件传递的完整过程

  1. 先将事件对象由上往下传递(父控件传递给子控件),找到最合适的控件来处理
  2. 调用最合适控件的touch方法
  3. 如果调用了[super touches...]方法就会将事件顺着响应者链条向上传递,传递给上一个响应者
  4. 接着就会调用上一个响应者的touches...方法

事件响应者

如何判断该控件的上一个响应者?
  1. 如果当前这个view是控制器的view,那么上一个响应者就是控制器
  2. 如果当前这个view不是控制器的view,那么上一个响应者就是父控件。

事件传递给UIApplication后如果不处理的话,该事件会销毁掉。

控制器view上的子控件的touch...方法如果子控件不处理那么都会顺着响应者链条向上传递给上一层响应者对象,比如可以交给控制器处理。

© 著作权归作者所有

共有 人打赏支持
杭城小刘
粉丝 14
博文 109
码字总数 54955
作品 0
杭州
iOS工程师
理解事件处理,响应者和响应者链

原文地址: 如原作者发现有侵权行为可责令我在24小时之内删除,前提是你能看到。 翻译者:毛毛可 学习事件是怎样在你的app中传递的,并学会应该如何处理它们. Apps使用responder(响应者对象)...

井FFFFFF
2017/12/07
0
0
​ 《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者

原创文章,欢迎转载。转载请注明:关东升的博客 应用与用户进行交互,依赖于各种各样的事件。事件响应者对象是可以响应事件并对其进行处理的对象,响应者链是由一系列链接在一起的响应者组成...

智捷课堂
2016/02/19
27
0
《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

原创文章,欢迎转载。转载请注明:关东升的博客 应用与用户进行交互,依赖于各种各样的事件。事件响应者对象是可以响应事件并对其进行处理的对象,响应者链是由一系列链接在一起的响应者组成...

tony关东升
2016/03/09
0
0
【响应链】cocoatouch事件处理流程深入解析

cocoatouch 事件处理流程 apple 文档 传递链和响应链 避开事件处理 事件分类 响应者链(Responder Chain)

创意总监
2016/06/16
42
0
iOS开发-关于UIResponder

我们的App与用户进行交互,基本上是依赖于各种各样的事件。例如,用户点击界面上的按钮,我们需要触发一个按钮点击事件,并进行相应的处理,以给用户一个响应。UIView的三大职责之一就是处理...

神补刀
2016/03/19
109
0

没有更多内容

加载失败,请刷新页面

加载更多

利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

Linux就该这么学
26分钟前
0
0
图像显示深入学习一:Activity启动过程

一个月左右写了图像显示深入学习之文章开篇文章表明了自己近期的计划,前半年重新学习了opengl es,c++以及Linux的一些知识,觉得是时候开始看图像这一块的源码了,边看边补缺补漏吧。 作为该...

JerryLin123
48分钟前
1
0
给MySQL授权远程访问

putty登录服务器; 登录MySQL: mysql -u root -p 新建远程用户: CREATE USER 'myusername' IDENTIFIED BY 'mypassword'; 授权: grant all on *.* to john@'101.102.103.104' identified by......

sweethome
今天
1
0
在t-io老巢造谣,不过有造谣的就会有反造谣的!

只发当事人的截图,不发表评论,以免有引导嫌疑 PS: 截图是由不同的人发过来的 本人已经不在此微信群 图3:有造谣的,就有反造谣的 图4是2018-09-23的t-io官方群的一个发言小统计,有助于让...

talent-tan
今天
100
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部