事件的传递及相应者链条

  除去高大上的标题,本文主要就是讲当你触碰手机屏幕上任意点的时候,系统是怎样找到那个需要响应该触碰事件的控件,以及该控件对触碰事件的响应情况

  首先是 找到应该响应该触碰事件控件的过程:触摸事件首先是被应用的消息循环机制检测到,加入到消息队列,到处理该消息时,由application向下问window,window又去问rootcontroller(这个触摸点在没在你的view范围中),rootcontroller又问自己的view,view又向下问自己的所有子控件,进行筛选,

筛选的规则是:

1.自己是否能接收触摸事件?

2.触摸点是否在自己身上?

3.以上都满足了就从后往前遍历子控件,重复前面的两个步骤

4.如果没有符合条件的子控件,那么就自己最适合处理

这里的“问”默认是通过控件的- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event方法一层一层从外往内掉用;

找到最后找到最适合处理该触摸事件的控件,该控件默认会有对触摸事件的处理:(以下就该是响应者链条的内容了)

根据控件对事件的默认响应情况,大概分三种(肯定不止):

1.button:默认会处理响应该事件,并且不会再调用 [super touchesBegan:touches withEvent:event];向上抛响应,这样该响应链条就断了;

2.uiview: 如果不实现uitouches方法,默认会调用父类(uiresponser)中的touches方法,该方法内部默认会自动把响应交给下一响应者处理;

3.uiimageview:默认是不与用户交互的,所以该控件默认也就不会被选为最佳处理事件的控件,所以该种类不应该算;

如果控件自己实现了touches方法来处理触摸事件,并且响应完又调用了[super touchesBegan:touches withEvent:event];来让下一响应者继续响应,这样一层一层由里向外久构成了响应者链条;

  需要说明的是:响应者不都必然是view等控件,也可能是viewController等控制器(UIviewController也继承于UIresponser);

找下一响应者的原则是:

1>如果当前这个view事控制器的view,那么控制器就是上一个响应者(控制器也继承了UIResponser,所有控制器也有touches……方法)

2>如果当前这个view不是控制器的view,那么父控件就是上一个响应者

响应者链的事件传递过程:

1.如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图

2.在视图层次结构的最顶级视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理

3.如果window对象也不处理,则其将事件或消息传递给UIApplication对象

4.如果UIApplication也不能处理该事件或消息,则将其丢弃

时间: 2024-07-29 03:40:21

事件的传递及相应者链条的相关文章

事件的传递和响应者链条

本文链接地址:http://www.linuxidc.com/Linux/2015-08/121270.htm 首先我们来看看iOS中事件的产生和传递过程: 1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中 2.UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常会先发送事件给应用程序的主窗口(keyWindow) 3.主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件 4.找到合适的视图控件后,就会调用视图控件

iOS中事件的传递和响应者链条

在iOS 开发中,常见的事件有三种类型,分别是:(1)触摸事件:平常手指在屏幕上滑动,产生的事件都是触摸事件(2)加速计事件:微信的摇一摇就是典型的加速计事件(3)远程控制事件:耳机控制歌曲上一首.下一首.暂停就是远程控制事件的应用.在触摸事件中,通常情况下,点击哪个控件,哪个控件就会产生反应.比如说,点击确定按钮,确定按钮会响应该事件,点击取消按钮,取消按钮会响应该事件.那么,系统是如何决定哪一个视图(控件)来响应该事件呢?当发生触摸事件后,系统会将该事件加入到一个由 UIApplicatio

史上最详细的iOS之事件的传递和响应机制

前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后事件的处理(touches方法的重写,也就是事件的响应) 其中重点和难点是: 1.如何寻找最合适的view 2.寻找最合适的view的底层实现(hitTest:withEvent:底层实现) (一)iOS中的事件 iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件这里我们只讨论iOS中的

事件的传递和响应机制(全)

前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后事件的处理(touches方法的重写,也就是事件的响应) 其中重点和难点是: 1.如何寻找最合适的view 2.寻找最合适的view的底层实现(hitTest:withEvent:底层实现) (一)iOS中的事件 iOS中的事件可以分为3大类型: 触摸事件 加速计事件 远程控制事件 这里我们只讨论iOS中

iOS开发-高级UI-响应者链条

一次完整的触摸事件的传递响应的过程UIApplication --> UIWindow --> 递归找到最适合处理事件的控件控件调用touches方法 --> 判断是否实现touches方法 --> 没有实现默认会将事件传递给上一个响应者 --> 找到上一个响应者PS:如果直到UIApplication都不响应,那么这个事件就被废弃了.1.响应者链条:由很多响应者链接在一起组合起来的一个链条响应者:继承自UIResponder的对象称之为响应者对象2.上一个响应者(默认做法是

android自定义控件系列教程-----touch事件的传递

前沿: 很久没有写过博客了,因为工作的原因很少有时间写东西了,最近想写一个UI系列的博客,因为我发现这一系列的都很少,而且没有那么系统,这里我想以我自己的观点来阐述一下如何自定义android 控件系列. 自定义控件阐述: 在我的理解里面自定义控件,需要了解到touch事件的传递.分发.拦截机制,Scroller类的运用,andorid 视图的理解,ViewGroup的熟悉,因为我们绝大多的控件都是继承自ViewGroup,还有就是要学会布局测量等. Touch事件的传递 首先我们要了解在and

[学习总结]4、Android的ViewGroup中事件的传递机制(一)

本文主要针对dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent三个方法,通过简单的例子来简单的介绍下. 根据字面意思的理解,dispatchTouchEvent分发触摸事件,onInterceptTouchEvent拦截触摸事件,onTouchEvent触摸事件.正如它们各自的字面意思,下面简单的列出各自的作用和用法. 1.dispatchTouchEvent作用:决定事件是否由onInterceptTouchEvent来拦截处理. 返回s

[学习总结]5、Android的ViewGroup中事件的传递机制(二)

下面是第一篇的连接 Android的ViewGroup中事件的传递机制(一) 关于onInterceptTouchEvent和onTouchEvent的详细解释. 1 public class MainActivity extends Activity { 2 Group1 group1; 3 Group2 group2; 4 MyTextView myTv; 5 6 /** Called when the activity is first created. */ 7 @Override 8

JavaScript 绑定事件时传递数据

var data = { name: 'Ruchee', email: '[email protected]' }; data.handleEvent = function (e) { console.log(this); }; document.getElementById('test_button').addEventListener('click', data, false); 重点:1. 绑定事件时传递数据本身2. 传递的数据中需要定义有一个 handleEvent 方法来负责事件响应