ioS基础篇(十九)——UIResponder简析
UIResponder类定义了对象相应和控制事件的接口,他是UIApplication、UIView的超类,这类的实例通常被称为应答对象。
一、Responder对象
在iOS系统中,能够响应并处理事件的对象称之为responder object, UIResponder是所有responder对象的基类,在UIResponder类中定义了处理各种事件,包括触摸事件(Touch Event)、运动事件(Motion Event)和远程控制事件(Remote-Control Events)的编程接口:
触摸事件:
1、当用户触摸到屏幕时调用方法:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
2、当用户触摸到屏幕并移动时调用此方法:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
3、当触摸离开屏幕时调用此方法:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
4、当触摸被取消时调用此方法:
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;
运动事件:
1、开始运动时调用方法:
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
2、结束运动时调用方法:
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
3、取消运动时调用方法:
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;
远程控制事件:
- (void)remoteControlReceivedWithEvent:(UIEvent *)event;
二、responder chain
在UIResponder中有一个非常重要的概念叫做Responder Chain,responder chain是一系列连接的responder对象,通过responder对象可以将处理事件的责任传递给下一个,更高级的对象,即当前responder对象的nextResponder。在IOS中通常使用hit-testing去找到那个被触摸的视图,这个视图叫hit-test view,当IOS找到hit-test view后就把touchevent交个那个视图来处理。
UIView中有两个方法用来确定hit-test view:
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;

如上图,这里所有的显示的View都是加载到主window上,点击视图D时看一下hit-testing的工作过程:
1、keyWindow调用pointInside:withEvent:判断触摸点是否在其范围内,返回Yes,确定该触摸事件发生在view A范围内。
2、ViewA调用pointInside:withEvent:判断触摸点是否在其范围内,返回Yes,遍历ViewA中的ViewB、ViewC(关于ViewB和ViewC先执行哪个,是根据ViewA添加子控件的先后顺序)。
3、ViewC调用pointInside:withEvent:判断触摸点是否在其范围内,返回Yes,确定触摸事件发生在了view C中,所以检查 view D,view E。
4、ViewE调用pointInside:withEvent:判断触摸点是否在其范围内,返回No,ViewE的hitTest:withEvent:返回nil。
5、ViewD调用pointInside:withEvent:判断触摸点是否在其范围内,返回Yes,ViewD的hitTest:withEvent:返回ViewD本身;所以view D成为了hit-test view。
Responder Chain 遵循一个特定的传播路径:如果hit-test view不能够处理该事件则UIKit会将事件传递给下一个Responder。

如上图,
1、初始的界面尝试去处理事件后者消息,把它处理不了则把事件交给它上一层视图处理,因为最开始的界面在它的view controller里的视图层次里不是最上层的。
2、上层视图尝试处理事件,如果他不能处理则将事件交给他的上层视图处理。
3、在view controller中最上层的视图尝试处理,它也不能处理则交给它的view controller来处理。
4、如果view controller也无法处理则交给window来处理。
5、window无法处理交给app object来处理。
6、app object也无法处理则将该事件丢弃掉。
管理响应链:
UIResponder提供了几个方法来管理响应链,包括让响应对象成为第一响应者、放弃第一响应者、检测是否是第一响应者以及传递事件到下一响应者的方法。
1、负责传递事件的方法是nextResponder
- (UIResponder *)nextResponder;
2、判定一个响应对象是否是第一响应者
- (BOOL)isFirstResponder;
3、将一个响应对象作为第一响应者
- (BOOL)becomeFirstResponder;
4、判定一个响应对象成为第一响应者的一个前提是它可以成为第一响应者
- (BOOL)canBecomeFirstResponder;
5、与上面两个方法相对应的是响应者放弃第一响应者的方法
- (BOOL)resignFirstResponder;
- (BOOL)canResignFirstResponder;
ioS基础篇(十九)——UIResponder简析的更多相关文章
- ios基础篇(九)——自定义UITabBar
上一篇讲到了UITabBarViewController,接着说说UITabBarViewController中怎么自定义TabBar. 今天仿写了微博,发现底部tabbar中间的button和其他有 ...
- Bootstrap <基础二十九>面板(Panels)
Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...
- 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(九)版本控制
日常啰嗦 还好在第一篇文章里就列好了接下来的主线及要写的知识点,不然都不知道要写什么东西了,开篇里已经列了基础篇要讲svn和git的知识点,所以这一篇就写一下版本控制. 项目实际效果展示在这里,账密: ...
- ios基础篇(二十九)—— 多线程(Thread、Cocoa operations和GCD)
一.进程与线程 1.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内: 如果我们把CPU比作一个工厂,那么进程就好比工厂的车间,一个工厂有 ...
- ios基础篇(十六)——UIWebView的基本使用
UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档等.UIWebView是一个混合体,具体的功能控件内置的,实现一些基本的功能.UIWebView可以查看Html网页,pdf文件,do ...
- ios基础篇(二十六)—— UITableViewCell的分组索引与标记
一.表视图的索引目录 首先要创建一个TableView,之前有说过,这里就不详细说了(参考前面第十四篇). 直接贴代码吧, #import "ViewController.h" @ ...
- ios基础篇(二十五)—— Animation动画(UIView、CoreAnimation)
Animation主要分为两类: 1.UIView属性动画 2.CoreAnimation动画 一.UIView属性动画 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIVie ...
- ios基础篇(二十四)—— 文字、图片的绘制及其自定义Button
这篇文章我们主要来拿官方的控件来研究一下,我们来仿照官方的控件,自己来实现它提供的控件: 首先来看看基本的图片与文字的绘制,很简单. 一.imageView 所有的视图都是继承自UIView,所以我们 ...
随机推荐
- 游戏制作之路:游戏引擎选择、Mac下和Windows下UnrealEngine 4体验对比、文档及其他
UnrealEngine 4和Unity3d的选择 订阅了UrealEngine4(UE4)开发者.我开始做网站用的是ASP.NET和C#,之后做网站虽然换用更方便的PHP(因为做的都是小网站).我想 ...
- 20151208_使用windows2012配置weblogic节点管理器
经过实践,weblogic节点管理器的作用主要有两点: 1.可通过weblogic控制台远程控制被管server启停. 2.可以自动重启被管server的进程,并且对spring框架提供比直接启动更快 ...
- 【Selenium】1.介绍 Selenium
本文供学习交流之用,没有商业用途,没有盈利. 完全是我自己为督促自己学习而翻译的.翻译的不好,见谅.来源于:http://www.guru99.com/introduction-to-selenium ...
- Cannot use object of type yii\db\Connection as array
$pointLog = $conn->createCommand('select * from table1 where is_deleted = 0 AND id1 = :id1 AND id ...
- 跟着8张思维导图学习javascript
学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将po出8张javascript相关的思维导图. 思维导图小tips:思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却又 ...
- Deferred解决JS同步问题
测试脚本: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...
- linux下rpm包安装、配置和卸载mysql
WIN10下虚拟机:VMware workstation 12 PRO 安装 # 1.查看系统版本 [root@vm-xiluhua][/home/xiluhua]$ cat /etc/redhat- ...
- python virtualenv
一 安装 pip install virtualenvwrapper - 把下面这句加到~/.bash_profile里面,如不嫌麻烦,也可以每次都手动执行.source /usr/local/bi ...
- [问题2014A06] 复旦高等代数 I(14级)每周一题(第八教学周)
[问题2014A06] 若 \(n\) 阶实方阵 \(A\) 满足 \(AA'=I_n\), 则称为正交矩阵. 证明: 不存在 \(n\) 阶正交矩阵 \(A,B\) 满足 \(A^2=cAB+B^ ...
- [问题2014S07] 解答
[问题2014S07] 解答 (本解答由沈启帆同学提供) 由复旦高代教材 P265 引理 7.4.1 知 \(F(P_i(\lambda)^{e_i})\) 的不变因子组为 \[1,\cdots, ...