文档章节

事件响应者链

杭城小刘
 杭城小刘
发布于 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
【响应链】cocoatouch事件处理流程深入解析

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

创意总监
2016/06/16
42
0
《从零开始学Swift》学习笔记(Day 68)——Cocoa Touch设计模式及应用之响应者链与触摸事件

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

tony关东升
2016/03/09
0
0
iOS开发-关于UIResponder

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

神补刀
2016/03/19
109
0

没有更多内容

加载失败,请刷新页面

加载更多

Qt那些事0.0.15

以下与Q_DECLARE_METATYPE相关内容全部是翻译自Qt文档。参看QVariant Class | Qt Core 5.9以及QMetaType Class | Qt Core 5.9 QVariant QVariant::fromValue(const T& value) 返回一份包含v......

Ev4n
11分钟前
1
0
spring上传文件返回绝对路径,简单工具类

import com.google.common.io.Files;import lombok.extern.slf4j.Slf4j;import org.springframework.web.multipart.MultipartFile;import java.io.File;import java.io.IOExceptio......

Boss-x
23分钟前
2
0
1个开发如何撑起一个过亿用户的小程序

本文由云+社区发表 2018年12月,腾讯相册累计用户量突破1亿,月活1200万,阿拉丁指数排行 Top 30,已经成为小程序生态的重量级玩家。 三个多月来,腾讯相册围绕【在微信分享相册照片】这一核...

腾讯云加社区
29分钟前
7
0
golang ssh包使用方法介绍

在使用gexpect包发现很多问题之外,这里又尝试使用ssh user@127.0.0.1的思路进行用户切换。这里记录下具体的使用方法,遇到的ssh: must specify HostKeyCallback 问题的解法方法及最终使用过...

linuxprobe16
34分钟前
2
0
layer

Layui Layer在open弹出层中异步加载数据和form表单radio、checkbox、select不渲染,不可点击的解决办法 layer 实现弹窗提交信息 function confirmUpdateAward(i) { layer.open({ ...

mickelfeng
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部