【学习笔记】响应者链条

  自学iOS有一两个月了,一直没有好好整理学习笔记,打算今天开始慢慢补上,就当是复习和补缺补漏吧。

  iOS的事件大致分为三种:触摸事件、加速计事件、远程控制事件

  首先要理解以下几个概念:

  一、响应者对象:

    在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”。

    UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件。

  二、UIResponder处理事件的主要方法

    触摸事件    

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

    加速计事件

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event;
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event;

    远程控制事件

- (void)remoteControlReceivedWithEvent:(UIEvent *)event;

  三、UITouch

    用户同时触摸的手指,每一根就代表一个UITouch对象,它保存着跟手指相关的信息,比如触摸的位置、时间、阶段。

    当手指移动(move)时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置。

    当手指离开(end)屏幕时,系统会销毁相应的UITouch对象.

  四、UIEvent

    触摸事件发生,必须会产生一个UIEvent对象,称为事件对象,记录事件产生的时刻和类型。

  五、首先处理事件的响应者

    发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中。

    UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)

    主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步

    找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理

    touchesBegan…

    touchesMoved…

    touchedEnded…

    

    下面是老师上课的PPT示例,说的很明白。

  

  UIView不接收触摸事件的三种情况

  1.alpha= 0.0 ~ 0.01

  2.hidden属性=YES

  3.userInteractionEnabled=YES

  注意:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的

  六、响应者链条

    合适的控件调用touches方法后,会默认地将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理。

  寻找上一个响应者的过程,看起来是寻找首要合适控件的逆过程。

  当前响应者的touches方法中如果调用[super touches],就会对用上一个响应者touches方法,同时可以将UITouch对象和UIEvent对象向上传递。

  这样就能够将一次触摸事件的事件对象和触摸对象的信息传递给多个响应者。

  问题:上一个响应者(nextResponder)是谁?

  判断步骤:
  1>如果当前的view是控制器的view,控制器就是上一个响应者
  2>如果当前的view不是控制器的view,那么父控件就是上一个响应者
  3>如果当前响应者是控制器,那么上一个响应者是UIWindow;如果UIWindow也不处理,就再往上传给UIApplication
  4>如果UIApplication也不处理,那么这条消息就被会废弃

  

  七、触摸事件处理过程

  1.用户触摸后,系统先将事件对象(event)由上往下传递(父控件传给子控件),找到最合适的控件来处理事件(递归查找当前控件的最适合子控件)

  2.调用合适控件的touches相关方法

  3.如果调用了super的touches相关方法,就会将事件顺着响应者链条往上传递,传给上一个响应者

  4.接着就会调用上一个响应者的touches方法

  5.只要当前响应者的touches方法中调用了super的touches方法,还会继续往上递归调用,直到不再调用super的touches方法

  八、补充面试题:什么是响应者链条?

  以下几个点是李明杰老师给的参考回答,可学习借鉴:

  1>响应者链条是由多个响应者对象连接起来的链条

  2>响应者对象是指能够处理事件的对象,即继承UIResponder的对象

  3>利用响应者链条,能让多个控件处理同一个触摸事件

  4>简要叙述响应者链条的往上传递,找到上一个响应者(nextResponder)

时间: 2024-08-09 19:53:37

【学习笔记】响应者链条的相关文章

响应者链条(事件的传递)(复习笔记)

1.如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件. 2.在以下几种情况下,控件是不能接收触摸事件 1.不接收用户交换  userInteractionEnable= NO; 2.隐藏 hiden = YES; 3.透明 alpha = 0.0 ~ 0.01; 提示:UIImageView的userInteractionEnable默认为NO,因此UIImageView以及他的子控件默认不接收触摸事件. 3.事件的完整处理过程 1.先将事件对象由上往下传递(由父控件传递给子控件),

iOS学习笔记(2)— UIView用户事件响应

iOS学习笔记(2)— UIView用户事件响应 UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YE

IOS学习笔记-触摸事件

一.事件传递的过程1.用户手指触摸屏幕,产生一个事件对象 2.系统会将这个事件对象添加到事件队列(先进先出)中 3.由UIApplication取出事件队列中的事件对象进行处理 4.UIApplication会先将事件对象传递给主要的UIWindow(当然,要先检测UIWindow是否能够接收和传递事件) 5.UIWindow会遍历所有的子控件,看看触摸点有没有落在某个子控件上面: 1> 如果触摸点没有落在子控件上,那么就由UIWindow直接处理这个事件,事件传递完毕 2> 如果触摸点落在子

IOS开发学习笔记-(2)键盘控制,键盘类型设置,alert 对话框

一.关闭键盘,放弃第一响应者,处理思路有两种 ① 使用文本框的 Did End on Exit 绑定事件 ② UIControl on Touch 事件 都去操作 sender 的  resignFirstResponder #import <UIKit/UIKit.h> @interface ViewController : UIViewController @property (weak, nonatomic) IBOutlet UITextField *txtUserName; @pro

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS学习笔记(1)— UIView 渲染和内容管理

iOS学习笔记(1)— UIView 渲染和内容管理 iOS中应用程序基本上都是基于MVC模式开发的.UIView就是模型-视图-控制器中的视图,在iOS终端上看到的.摸到的都是UIView. UIView在屏幕上定义了一个矩形区域和管理区域内容的接口.在运行时,一个视图对象控制该区域的渲染:UIView继承自UIResponder,UIResponder是用来响应事件的类,UIView也具有响应事件的能力.所以说UIView具有三个基本的功能,绘制内容并管理内容的布局,响应用户交互,动画.正是

【Unity 3D】学习笔记四十一:关节

关节 关节组件可以添加至多个游戏对象中,而添加关节的游戏对象将通过关节连接在一起并且感觉连带的物理效果.需要注意的是:关节必须依赖于刚体组件. 关节介绍 关节一共分为5大类:链条关节,固定关节,弹簧关节,角色关节和可配置关节. 链条关节(hinge joint):将两个物体以链条的形式绑在一起,当力量大于链条的固定力矩时,两个物体就会产生相互的拉力. 固定关节(fixed joint):将两个物体永远以相对的位置固定在一起,即使发生物理改变,它们之间的相对位置也将不变. 弹簧关节(spring

iOS学习笔记-iOS事件处理之触摸事件

在iOS学习中,接触最多的就是触摸事件,这节主要学习一下触摸事件的简单使用. 1.iOS中的事件 2.触摸事件 2.1 触摸事件的完整处理过程: 1> 先将事件对象由上往下传递(由父控件传递给子控件), 找到最合适的控件来处理这个事件 2> 调用最合适控件的touches.....方法 3> 如果调用了[super touches...];就会将事件顺着响应者链条往上传递,传递给上一个响应者 4> 接着就会调用上一个响应者的touches.....方法 2.2 什么是响应者链条?

iOS学习笔记之ARC内存管理

iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其所指向对象的所有权 当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法(或函数)拥有该变量所指向的对象,如: int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSSt