转载:响应者链工作原理

响应者链

响应者链是由一个一个响应者组成的长链;
响应者链定义了iOS中触摸事件的交互规则;
如果hit-test检测出的view没有响应事件,事件就会沿着响应者链往下传递;
如果链中某个响应者响应了事件或者已经没有响应者了,传递就会结束。

触摸检测(Hit-Test)


通过触碰检测找出Touch发生在哪个视图上,递归检测所有子视图,定位准确位置;
如果触摸发生在E上;
Touch在A Bounds内;
检测子视图B和C;
如果Touch没在B里,在C里;
检测D和E;
Touch没在D里,在E里,且E没子视图。

调整事件传递

关闭事件的传递:userInteractionEnable 属性设置为NO,此属性是UIView的,所有子类都能设置。当视图hidden属性为YES或者alpha为0时,视图也不接受事件。
在一定时间内关闭事件传递:应用程序调用UIApplication的benginIgnoringInteractionEvents和endIgnoringInteractionEvents.

UIEvent

UIEvent:事件,是由硬件捕获到的一个表示用户操作设备的对象;
事件分为三类:触摸事件、晃动事件、远程控制事件;

UIResponder

UIResponder:响应者,是可以响应事件并且可以对其进行处理的对象;
UIResponder是响应者的基类,UIApplication、UIView和所有从UIView派生出来的子类都是源自它;
第一响应者是当前正在接受事件的响应者对象。

UITouch

UITouch:手指,表示触摸事件的一个手指;
UIView支持触摸事件,而且支持多点触摸;
需要定义UIView子类,实现触摸相关的方法;

touchesBegan:withEvent://开始触摸
touchesMoved:withEvent://手指移动
touchesEnded:withEvent://结束触摸
touchesCancelled:withEvent://触摸终端
locationInView://当前手指位置
previousLocationView://上一次手指位置

iOS默认的是单点触摸,如果想要支持多点触摸,需要将multipleTouchEnabled 设置为YES,默认是NO。

总结iOS 视图不响应点击事件的可能性:

view的userInteractionEnable 没有设置为YES;
子视图 超过 父视图的显示区域;
当视图hidden属性为YES或者alpha为0时;

其他欢迎补充。

本文转自:李剑飞的技术博客
原文 http://lijianfei.sinaapp.com/?p=599

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 好奇触摸事件是如何从屏幕转移到APP内的?困惑于Cell怎么突然不能点击了?纠结于如何实现这个奇葩响应需求?亦或是...
    Lotheve阅读 58,204评论 51 603
  • 在iOS开发中经常会涉及到触摸事件。本想自己总结一下,但是遇到了这篇文章,感觉总结的已经很到位,特此转载。作者:L...
    WQ_UESTC阅读 6,140评论 4 26
  • 用户以多种方式操纵他们的iOS设备,例如触摸屏幕或摇动设备。 iOS会解释用户何时以及如何操作硬件并将此信息传递到...
    坤坤同学阅读 4,048评论 7 19
  • 概述 应用程序使用响应者对象来接收和处理事件,属于UIResponder类的实例对象都是响应者,常见的子类包括UI...
    渐z阅读 2,701评论 0 3
  • 本篇包括2部分:前篇是UIResponder的官方API的记录,后篇是对官方API的理解 UIResponder概...
    你好自己阅读 1,457评论 0 7