iOS的事件传递响应链

原创 2016年05月31日 18:03:29

一、响应链

响应链主要是对UIResponder及其子类事件传递的描述。

UIViewControllerUIView都是继承UIResponder的。

而其中的UIView更是UIKIT框架下大部分控件的父类(几乎所有吧),所以能够响应事件的对象,实质上都相当于不断拦截转发至最后的可响应对象。


=========================================================

如下图,可以看到UIResponder的整个结构



================================================

可以看到我们熟悉的touch事件,

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
- (void)touchesCancelled:(nullableNSSet<UITouch *> *)touches withEvent:(nullableUIEvent *)event;
- (void)touchesEstimatedPropertiesUpdated:(NSSet *_Nonnull)touchesNS_AVAILABLE_IOS(9_1);

以及常用的对Responder的处理

- (nullableUIResponder*)nextResponder;
- (BOOL)canBecomeFirstResponder;   // default is NO
- (BOOL)becomeFirstResponder;
- (BOOL)canResignFirstResponder;   // default is YES
- (BOOL)resignFirstResponder;
- (BOOL)isFirstResponder;

所以对于继承UIResponder的所有对象,都可以对touch事件进行重写,拦截事件处理,而如果不进行处理,则最后会交给基类的UIResponder进行丢弃。

二、对于touch事件传递

1.获取事件发生的view

UIView中有如下方法:

- (nullableUIView *)hitTest:(CGPoint)point withEvent:(nullableUIEvent *)event
- (BOOL)pointInside:(CGPoint)point withEvent:(nullableUIEvent *)event;

事件发生的view就是hitTest返回的view,而得到这个view则需要pointInside通过point来确定view是否在点击point的范围内,不断的递归得到最上层的view。

2.touch事件传递

对于touch事件,windows对象首先会将事件传递给事件发生的view(上面提到的view)

如果这个view不处理事件,则事件响应链将事件传给下一个Responder(我们可以通过nextResponder得知下一个响应者,基本上是不断的superview->ViewController->UIWindows->UIApplication->AppDelegate(AppDelegate继承于UIResponder)),

直至有对象响应,或者到AppDelegate(UIResponder则遗弃该事件。




oc-事件传递响应链

大概的逻辑如下- - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ UIView *touchView = se...
  • li198847
  • li198847
  • 2016年05月17日 20:25
  • 1229

iOS 事件传递之响应链

当你设计App时你可能需要动态的响应事件。例如,一个触摸事件可能发生在屏幕上不同的对象中,你需要决定哪个对象来响应这个给定的事件,理解对象如何接收事件。 当用户触发的一个事件发生,UIKit会创...
  • l863784757
  • l863784757
  • 2016年03月14日 12:06
  • 725

iOS 事件响应链详解(The Responder Chain)

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc?viewmode=list 我的stackoverflow前言:在iOS编程中,经常会有复杂的时间v...
  • Hello_Hwc
  • Hello_Hwc
  • 2015年10月16日 12:17
  • 4041

iOS事件的分发机制和响应者链(Swift)

当我们在设计自己的APP时,可能会想动态的响应事件.例如:屏幕上许多对象都能够发生触摸,我们必须决定哪一个对象来响应给定的事件并且知道对象是如何接受事件的。当用户事件产生的时候,UIKit会创建一个事...
  • longshihua
  • longshihua
  • 2016年07月19日 10:48
  • 2584

响应者链条中事件传递的过程

1、如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件。 2、在以下几种情况下,控件是不能接收触摸事件   1.不接收用户交换  userInteractionEnable= N...
  • luyangMVP
  • luyangMVP
  • 2016年07月29日 01:33
  • 368

ios事件传递和响应

ios事件传递分为两个步骤,一、寻找触发视图  二、事件传递响应 一、寻找触发视图 第一响应者(First responder)指的是当前接受触摸的响应者对象(通常是一个UIView对象),即...
  • yongzhouyang000
  • yongzhouyang000
  • 2016年03月15日 16:29
  • 1276

iOS开发-事件传递与响应者链中的hitTest方法和pointInside方法

事件传递与响应者链是iOS开发中的重点基础知识,也是容易混淆的知识点。
  • Cehae
  • Cehae
  • 2016年10月15日 12:56
  • 1111

IOS用户事件传递与UIGestureRecognizer的一些思考

本人第一次发表技术文章,哪里有不足之处还请多多包涵,望各位提出宝贵得意见。 在内容中有哪些说的不对的地方还请多多指出,只有在讨论中才会有进步! 我们在开发中总是会遇到一些用户事件的处理,可是他得消息链...
  • war3Rexxar
  • war3Rexxar
  • 2015年03月13日 14:13
  • 1210

iOS视图响应者链以及响应处理和传递过程

用户点击屏幕后产生的一个触摸事件,经过一些列的传递过程后,会找到最合适的视图控件来处理这个事件,找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理,事件包括(不做详解): t...
  • wei78008023
  • wei78008023
  • 2015年04月06日 18:43
  • 614

UIResponse响应者链

这篇文章想跟大家分享的主旨是iOS捕获用户事件的各种情况,以及内部封装的一些特殊事件。 我们先从UIButton谈起,UIButton大家使用的太多了,他特殊的地方就在于其内置的普通Defaul...
  • Roger_Jin
  • Roger_Jin
  • 2015年04月28日 11:43
  • 1613
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS的事件传递响应链
举报原因:
原因补充:

(最多只允许输入30个字)