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简析的更多相关文章

  1. ios基础篇(九)——自定义UITabBar

    上一篇讲到了UITabBarViewController,接着说说UITabBarViewController中怎么自定义TabBar. 今天仿写了微博,发现底部tabbar中间的button和其他有 ...

  2. Bootstrap <基础二十九>面板(Panels)

    Bootstrap 面板(Panels).面板组件用于把 DOM 组件插入到一个盒子中.创建一个基本的面板,只需要向 <div> 元素添加 class .panel 和 class .pa ...

  3. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合基础篇(九)版本控制

    日常啰嗦 还好在第一篇文章里就列好了接下来的主线及要写的知识点,不然都不知道要写什么东西了,开篇里已经列了基础篇要讲svn和git的知识点,所以这一篇就写一下版本控制. 项目实际效果展示在这里,账密: ...

  5. ios基础篇(二十九)—— 多线程(Thread、Cocoa operations和GCD)

    一.进程与线程 1.进程 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内: 如果我们把CPU比作一个工厂,那么进程就好比工厂的车间,一个工厂有 ...

  6. ios基础篇(十六)——UIWebView的基本使用

    UIWebView是内置的浏览器控件,可以用它来浏览网页.打开文档等.UIWebView是一个混合体,具体的功能控件内置的,实现一些基本的功能.UIWebView可以查看Html网页,pdf文件,do ...

  7. ios基础篇(二十六)—— UITableViewCell的分组索引与标记

    一.表视图的索引目录 首先要创建一个TableView,之前有说过,这里就不详细说了(参考前面第十四篇). 直接贴代码吧, #import "ViewController.h" @ ...

  8. ios基础篇(二十五)—— Animation动画(UIView、CoreAnimation)

    Animation主要分为两类: 1.UIView属性动画 2.CoreAnimation动画 一.UIView属性动画 UIKit直接将动画集成到UIView类中,实现简单动画的创建过程.UIVie ...

  9. ios基础篇(二十四)—— 文字、图片的绘制及其自定义Button

    这篇文章我们主要来拿官方的控件来研究一下,我们来仿照官方的控件,自己来实现它提供的控件: 首先来看看基本的图片与文字的绘制,很简单. 一.imageView 所有的视图都是继承自UIView,所以我们 ...

随机推荐

  1. in-list expansion

    in-list expansion也被称作or expansion --针对in后面是常量集合的另外一种处理方法.优化器会把目标sql中in后面的常量集合拆开,把里面的每个常量都提出来形成一个分支,各 ...

  2. 《30天自制操作系统》12_day_学习笔记

    harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定 ...

  3. cookie的三种操作方法

    1,jquery.cookie.js 这一篇文章已经写的很详细了: http://www.cnblogs.com/afuge/archive/2013/07/03/3169048.html 2,原生j ...

  4. Mac电脑AndroidStudio使用SVN进行版本控制

    http://blog.csdn.net/xiaoshi720/article/details/49467523

  5. MVC 移除复数表名的契约

    在数据库上下文中添加: using System.Data.Entity.ModelConfiguration.Conventions; protected override void OnModel ...

  6. VS2013 密钥

    MXS&Vincene  ─╄OvЁ  &0000017─╄OvЁ  MXS&Vincene MXS&Vincene  ─╄OvЁ:今天很残酷,明天更残酷,后天很美好, ...

  7. Ajax jsonp

    http://blog.csdn.net/superhosts/article/details/9057301

  8. Web Performance Test : IP切换/IP欺骗

    译者前言 本文翻译自<Visual Studio Performance Testing Quick Reference Guide 3.6> 有关于IP Switching的章节.< ...

  9. python高性能代码之多线程优化

    以常见的端口扫描器为实例 端口扫描器的原理很简单,操作socket来判断连接状态确定主机端口的开放情况. import socket def scan(port): s = socket.socket ...

  10. Quality assessment and quality control of NGS data

    http://www.molecularevolution.org/resources/activities/QC_of_NGS_data_activity_new table of contents ...