iOS中响应者链条-触摸事件
总体来说,分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中响应者链条-触摸事件的更多相关文章
- iOS中响应者链条-触摸事件,hitTest方法坐标转换
总体来说,分2个步骤: 一,从上到下寻找合适的控件来处理这个触摸事件.如下图,如果点击了黄色4,则UIApplication -> UIWindow -> 1白色 -> 2橙色 -& ...
- iOS开发系列之触摸事件
基础知识 三类事件中触摸事件在iOS中是最常用的事件,这里我们首先介绍触摸事件. 在下面的例子中定义一个KCImage,它继承于UIView,在KCImage中指定一个图片作为背景.定义一个视图控制器 ...
- iOS学习笔记之触摸事件&UIResponder
iOS学习笔记之触摸事件&UIResponder 触摸事件 与触摸事件相关的四个方法如下: 一根手指或多根手指触摸屏幕 -(void)touchesBegan:(NSSet *)touches ...
- WPF中的多点触摸事件
UIElement在WPF4下添加了很多支持多点触摸的事件,通过它们可以在硬件支持的情况下处理多点触摸,以下通过代码来说明通过处理这些事件,我们可以做些什么: 一.触摸相关的多种事件,跟鼠标事件是对应 ...
- iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别
触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponde ...
- iOS中的触摸事件和手势处理
iOS中的事件可以分为三大类: 1> 触摸事件 2> 加速计事件 3> 远程控制事件 响应者对象 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并 ...
- iOS中—触摸事件详解及使用
iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...
- OS开发中的事件处理(二)-事件传递,响应者链条
事件处理的事件传递 简介: 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件 队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理, ...
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...
随机推荐
- LeetCode - 49. Group Anagrams
49. Group Anagrams Problem's Link ------------------------------------------------------------------ ...
- Java泛型-类型擦除
一.概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变 ...
- MDI窗体容器 权限设置
MDI窗体容器:它可以让其它窗体在它的内部打开,无法超出它的范围将某个窗体的属性:IsMdiContainer设置为true - 窗口样式如何将其它窗体在它的内部打开?窗体对象名.MdiParent ...
- TCP 与 UDP
TCP Transmission Control Protocol,传输控制协议,传输层通信协议. 采用“带重传的肯定确认”(Positive Acknowledge with Retransmiss ...
- 【Java每日一题】20161111
package Nov2016; import java.io.Serializable; public class Ques1111 implements Serializable{ private ...
- c++之string.find(string)
先来看一个例子吧: #include "iostream" #include "string" using namespace std; // 定义函数求str ...
- [javaSE] 反射-动态加载类
Class.forName(“类的全称”) ①不仅表示了类的类类型,还代表了动态加载类 ②请大家区分编译,运行 ③编译时刻加载类是静态加载类,运行时刻加载类是动态加载类 Ⅰ所有的new对象都是静态加载 ...
- Git远程和分支管理
一.远程 Git是分布式版本控制系统,最重要的优点就是远程仓库托管代码.不用自己搭建一个服务器,在github上面注册一个账户就可免费获取远程仓库. 首先需要先在github上面 ...
- 把Java生成的RSA公钥、私钥转换成.NET使用的XML格式
import java.security.KeyFactory; import java.security.interfaces.RSAPrivateCrtKey; import java.secur ...
- Ouibounce – 在用户离开你网站时显示模态弹窗
Ouibounce 是一个微小的库,用于实现在用户离开你的网站的时候显示一个模式窗口.这个库可以帮助你增加着陆页的转换率. Ouibounce 会在当鼠标光标移动到接近(或通过)视口(viewport ...