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则遗弃该事件。




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS 事件传递之响应链

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

iOS事件响应链传递的一些理解

最近公司分享会上有同事分享了事件响应链的一些细节和逻辑,借这个机会把我觉得要注意的点整理一下。 1、事件传递顺序 事件的传递顺序,我就不说什么从UIApplication开始下传了,这边只说说视图层的...

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

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

iOS事件传递与响应者链

从本质上讲,苹果设备响应事件的整个过程可以分为两个步骤:步骤1:寻找目标。在iOS视图层次结构中找到触摸事件的最终接受者; 步骤2:事件响应。基于iOS响应者链(Responder Chain)处理...

iOS开发 - 事件传递响应链

一、序言当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图。在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch和U...

iOS开发-事件传递响应链

序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图。在我们点击屏幕的时候,iphone OS获取到了用户进行了“单击”这一行为,操作系统把包含这些点击事件的信息包装成UITouch...

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

首先我们来看看iOS中事件的产生和传递过程: 1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中 2.UIApplication会从事件队列中取出最前...

<iOS>响应事件传递, nextResponder研究

这里,我们考虑以下二种情况。 问题1。 如何调用父view的controller里面的方法? 答案如下: [[self superview ].nextResponder  ...

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

首先我们来看看iOS中事件的产生和传递过程: 1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的队列事件中 2.UIApplication会从事件队列中取出最前...

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

前言: 按照时间顺序,事件的生命周期是这样的:   事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view、寻找最合适的view的底层实现、拦截事件的处理)->找到最合适的vi...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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