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. 【Unity3D基础】让物体动起来①--UGUI鼠标点击移动

    背景 首先还是先声明自己是比较笨的一个人,总是找不到高效的学习方法,目前自己学习Unity3D的方式主要是两种,一种是直接看高质量的源码,另一种是光看不行还要自己动手,自己写一些有代表性的小程序,这也 ...

  2. CTeX学习心得总结

    CTeX 又称 CTeX中文套装,是基于 Windows 下的 MiKTeX 的发行版,集成了编辑器WinEdt 和 PostScript 处理软件 Ghostscript 和 GSview 等主要工 ...

  3. 学习OpenCV——SVM 手写数字检测

    转自http://blog.csdn.net/firefight/article/details/6452188 是MNIST手写数字图片库:http://code.google.com/p/supp ...

  4. Js原生 双向数据绑定

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 夺命雷公狗-----React---4--props变量的传递

    提示:props的值是不可以改变的... <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  6. visual studio code + Nodejs + Typescritpt + angularjs2 + bootstrap 环境搭建/Elementary os

    1.apt-get update 99% waiting for headers卡住了,fix如下 sudo apt-get clean cd /var/lib/apt sudo mv lists l ...

  7. WMI资料汇总

    简介 http://technet.microsoft.com/zh-cn/library/ee692772.aspx#E5IAC 主页 http://msdn.microsoft.com/zh-cn ...

  8. Android 去除最上面应用名称及图标

    @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); r ...

  9. 如何用css做一个细虚线边框表格

    <style type="text/css"> <!-- .dashed_tbl { border-top: 1px dashed #333333; border ...

  10. LeetCode----202. Happy Number(Java)

    package isHappy202; /* * Write an algorithm to determine if a number is "happy". A happy n ...