总体来说,分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. C# CSV文件读写

    public class CSVFileHelper { /// <summary> /// 将DataTable中数据写入到CSV文件中 /// </summary> /// ...

  2. ASP.NET MVC系列:为视图添加查询功能

    首先,在MoviesController里添加一个查询方法,代码如下 public ActionResult SearchIndex(string title) { //查询数据库中的电影表 var ...

  3. iOS 阶段学习第十天笔记(字符串操作)

    iOS学习(C语言)知识点整理 一.字符串的操作 1)字符串的存储,字符数组,在堆里面申请内存空间. 实例代码: #include <stdlib.h> #include <stri ...

  4. 初识Oracle数据库的基本操作

    SQL> --切换用户 SQL> connect practice/ 已连接. SQL> --查询学生表信息 SQL> select * from stuInfo; STUNO ...

  5. 从头开始 启动开源电商项目jShop

    1. 引言 干了三年C#, 有了转Java 的念想,所以尝试学习一下java web,java语法本身和C#没有太多的差别,所以打算看看开源的java项目,开源的Java项目还是非常非常多的,曾经看了 ...

  6. Eclipse导入Java项目时“No projects are found to import”错误的处理

    用Eclipse导入Java项目时,经常会出现“No projects are found to import”错误(尤其是导入网上下载的项目时),这是因为文件夹里面没有.project和.class ...

  7. nginx平台初探(100%)

    http://tengine.taobao.org/book/chapter_02.html 初探nginx架构(100%)¶ 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么 ...

  8. 修复 XE8 FMX Windows 列印旋转文字问题

    问题:XE8 Firemonkey Windows 无法列印旋转文字(与显示在视窗里的代码相同时) 适用:XE8 Windows 平台(其它平台测试没问题) 修复前效果: 修复后效果: 修复方法: 请 ...

  9. form表单

      <form> <input type="text" value="123">   文本输入框,value值为显示在文本框中的默认值, ...

  10. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...