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. RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件Web业务平台

    RDIFramework.NET ━ .NET快速信息化系统开发框架  工作流程组件Web业务平台 接前两篇: RDIFramework.NET ━ .NET快速信息化系统开发框架 ━ 工作流程组件介 ...

  2. git制作增量包用于更新代码

    1 先找到指定的开始提交id,比如 05104e3475f63e1e49fbfcbd424a4a3801b95645 2 找到结束的提交id,比如 a0eb9bc6d4e1801062877fd435 ...

  3. 写在开始编写Java之前(1)——Java的跨平台性

    Java语言之所以比C语言更加实用 是有原因的 Java的一个重要的特点——跨平台性 无论是哪个平台,如Windows.Linus还是Mac系统 Java的语法都是一样的 这个要比C语言用处要广 因为 ...

  4. 搭建springmvc的步骤

    一定注意文件的层级关系 1.cope相关的jar包到web-inf/lib目录下,并添加到类路径中. 2.配置web.xml文件,配置前端控制器DisPatcherServlet <servle ...

  5. overflow:hidden---清除浮动,隐藏溢出

    overflow:hidden这个CSS样式是大家常用到的CSS样式,但是大多数人对这个样式的理解仅仅局限于隐藏溢出,而对于清除浮动这个含义不是很了解.一提到清除浮动,我们就会想到另外一个CSS样式: ...

  6. css3创建一个上下线性渐变色背景的div

    <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title> ...

  7. url结构说明

    就以下面这个URL为例,介绍下普通URL的各部分组成 http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&pa ...

  8. Css Study - 横向MENU

    http://cssmenumaker.com/menu/tabbed-chrome-and-blue HTML <div id="topMenu"> <ul&g ...

  9. python入门练习题1

    常见python入门练习题 1.执行python脚本的两种方法 第一种:给python脚本一个可执行的权限,进入到当前存放python程序的目录,给一个x可执行权限,如:有一个homework.py文 ...

  10. gdb多进程调试

    http://blog.csdn.net/nbabn/article/details/24984501 http://blog.csdn.net/zb872676223/article/details ...