总体来说,分2个步骤:

一,从上到下寻找合适的控件来处理这个触摸事件。如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -> 3蓝色 -> 4黄色。

二,找到4黄色后,再从下到上遍历响应者链条:4黄色 -> 3蓝色 -> 2橙色  -> 1白色  -> UIWindow  -> UIApplication

1)如果4黄色实现了touches...这些函数(具体下面第二条)且没有调用 super...则事件不再向上传递;如果调用了super...方法则事件会继续向上传递。

2)如果4黄色没有实现touches...这些函数,则直接向上传递。

详细介绍:

1 什么是响应者对象

在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”

2 触摸事件常用处理方法

  • -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;一根或者多根手指开始触摸view
  • -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;一根或者多根手指在view上移动(只有产生一定的位移才会调用)
  • -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;一根或者多根手指离开view,系统会自动调用view的下面方法
  • -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; 触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程

提示:touches中存放的都是UITouch对象

3  UITouch对象

当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象,一个手指对应一个UITouch对象。如果有两个手指则会有UITouch对象,因此可以根据(NSSet *)touches的个数来判断有几个手指。

作用:

  • 保存着跟手指相关的信息,比如触摸的位置、时间、阶段;
  • 当手指移动时,系统会更新同一个UITouch对象;
  • 当手指离开屏幕时,系统会销毁相应的UITouch对象。

4  UIView不接收触摸事件的三种情况

  • userInteractionEnabled = NO
  • hidden = YES
  • alpha = 0.0 ~ 0.01

提示:UIImageView的userInteractionEnabled默认是NO,因此它和它的子控件默认不能接收触摸事件。

5  寻找合适的响应者

从上到下寻找合适的控件,比如UIApplication -> UIWindow ->父控件子控件这样一级一级的找下去。

寻找顺序,或原则

  • 1> 自己是否能接收触摸事件?否,事件传递到此结束;
  • 2> 触摸点是否在自己身上?否,事件传递到此结束。调用;
  • 3> 从后往前遍历子控件,重复前面的两个步骤 (所谓从后往前遍历:即后添加的控件优先级高。准确说是subviews数组后面的优先级高,如果是storyboard开发,则是下面的优先级高);
  • 4> 如果没有符合条件的子控件,那么就自己最适合处理。

调用的两个函数:- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event

总结:很明显,如果父控件不能接收,则不再找子控件。

6  响应者链条

从下到上寻找合适的控件来处理这个事件,如果实现了touches。。。函数且没有调用super方法则事件不再向上传,如果没有实现touches或者在touches里面调用了super方法则事件继续向上传。(super不是指的父类,而是上一个响应者)

提示:如果当前的view是控制器的view,那控制器就是上一级响应者,否则上一级响应者为父控件。

7  自己实现touches...

如果没有调用super...,则系统不会做默认的处理,比如实现了UIButton的touchBegan方法则系统不会执行button的敲击事件(不发送消息)。

iOS中响应者链条-触摸事件的更多相关文章

  1. iOS中响应者链条-触摸事件,hitTest方法坐标转换

    总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...

  2. iOS开发系列之触摸事件

    基础知识 三类事件中触摸事件在iOS中是最常用的事件,这里我们首先介绍触摸事件. 在下面的例子中定义一个KCImage,它继承于UIView,在KCImage中指定一个图片作为背景.定义一个视图控制器 ...

  3. iOS学习笔记之触摸事件&UIResponder

    iOS学习笔记之触摸事件&UIResponder 触摸事件 与触摸事件相关的四个方法如下: 一根手指或多根手指触摸屏幕 -(void)touchesBegan:(NSSet *)touches ...

  4. WPF中的多点触摸事件

    UIElement在WPF4下添加了很多支持多点触摸的事件,通过它们可以在硬件支持的情况下处理多点触摸,以下通过代码来说明通过处理这些事件,我们可以做些什么: 一.触摸相关的多种事件,跟鼠标事件是对应 ...

  5. iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

    触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponde ...

  6. iOS中的触摸事件和手势处理

    iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...

  7. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  8. OS开发中的事件处理(二)-事件传递,响应者链条

    事件处理的事件传递 简介: 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件 队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理, ...

  9. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

随机推荐

  1. iOS开发的一些奇巧淫技

    TableView不显示没内容的Cell怎么办? 类似这种,我不想让下面那些空的显示. 很简单. self.tableView.tableFooterView = [[UIView alloc] in ...

  2. 【视频处理】YUV格式说明

    YUV,是一种颜色编码方法,Y表示明亮度(Luminance.Luma),U和V则是色度.浓度(Chrominance.Chroma). YUV,Y`UV,YCbCr,YPbPr等都可以称为YUV,彼 ...

  3. Lua使用心得(2)

    在lua脚本调用中,如果我们碰到一种不好的脚本,例如: while 1 do do end 那我们的程序主线程也会被阻塞住.那我们如何防止这种问题呢?下面就给出一个解决的办法. 首先为了不阻塞主线程, ...

  4. HTTP & HTTPs

    HTTP HTTP 消息 HTTP 方法 参考 [1]. HTTP 协议初识 - 阮一峰: HTTPS 参考 [1]. HTTPS 升级指南 - 阮一峰:

  5. 背水一战 Windows 10 (4) - UI: 多窗口

    [源码下载] 背水一战 Windows 10 (4) - UI: 多窗口 作者:webabcd 介绍背水一战 Windows 10 之 UI 多窗口 示例1.自定义帮助类,用于简化 Secondary ...

  6. EL表达式之sessionScope

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以 $ ...

  7. UML类图画法及其之间关系

    1.泛化又名继承(Generalization),带空心箭头的实线表示,箭头指向父类 2.实现(Realization),带空心的虚线表示 3.关联(Association),类与类之间的关联,它使一 ...

  8. Java集合源码分析(三)LinkedList

    LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全 ...

  9. Django 模版语言详解

    一.简介 模版是纯文本文件.它可以产生任何基于文本的的格式(HTML,XML,CSV等等). 模版包括在使用时会被值替换掉的 变量,和控制模版逻辑的 标签. 例: {% extends "b ...

  10. MP4和HR-HDTV压制教程

    写在前 几年前还没工作的时候,长期混迹于百度“恐怖片吧”和“电锯惊魂吧”.因喜欢看电影,也自学了RMVB内嵌字幕的压制. 偶然机会加入@谢耳朵字幕组,因RMVB过于陈旧,人人影视所有美剧也全面抛弃了R ...