iOS事件响应者链、

2018-05-17  本文已影响0人  晴天ccc

一、知识点简介、

1.0 iOS中的事件可以分为三大类型:

1、触屏事件(例如点击按钮、通过手势缩放图片、拖动上下滚动页面等)

2、加速计事件(摇一摇红白,旋转设备控制赛车,指南针等)

3、远程控制事件(耳机线控,外接手柄,遥控器等)


1.1 响应者对象UIResponder

用户对手机进行操作就会产生事件,那么就要有程序去响应。在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为:响应者对象。

NS_CLASS_AVAILABLE_IOS(2_0)  @interface  UIApplication :UIResponder

NS_CLASS_AVAILABLE_IOS(2_0)  @interface  UIView:UIResponder

NS_CLASS_AVAILABLE_IOS(2_0)  @interface UIViewController:UIResponder

@interface    CALayer  :NSObject <NSSecureCoding,CAMediaTiming>

我们可以看出UIApplication、UIView、UIViewController都是继承自UIResponder类,可以响应和处理事件。CALayer不是UIResponder的子类,无法处理事件、

1.2 UIEvent

一个UIEvent对象描述一次用户交互行为。例如:用户点击手机屏幕,摇晃手机等。iOS系统都会收到UIEvent事件。

1.3 UITouch

当用户用手机点击屏幕时,会产生UITtouch对象。

该UITouch对象会记录手指的运动信息,比如:位置,时间,阶段等。手指在屏幕的时候系统会更新同一个UITouch对象,如果离开屏幕,该对象会被销毁。

一个UITouch对象对应了一根手指,在事件中可以根据NSSet中UITouch对象的数量得出是单指还是多指等。


【二】事件的产生和传递

用户触摸屏幕,会产生一个触摸事件,操作系统会将该触摸事件加入到UIApplication管理事件队列(串行,先进先出)。

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

主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。

附:iOS程序生命周期详解、

1.当iOS程序中发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列中

2.UIApplication将处于任务队列最前端的事件向下分发。即UIWindow。

3.UIWindow将事件向下分发,即UIView。

4.UIView首先看自己是否能处理事件,触摸点是否在自己身上。如果能,那么继续寻找子视图。

5.遍历子控件,重复以上两步。

6.如果没有找到,那么自己就是事件处理者。

7.如果自己不能处理,那么不做任何处理。

这一寻找的过程,被称作事件的响应链。


2.2 补充

如果当前这个view是控制器的view,则控制器是父控件,如果view不是属于控制器的view,则父控件就是上一个响应者。

判断UIView不能接受触摸事件的三种情况:

1、不接受用户交互 userInteractionEnabled = NO;

2、隐藏 hidden = YES;

3、alpha = 0.0-0.1

【三】探究

例如,不想让蓝色的view接收事件,那么可以设置蓝色的view的userInteractionEnabled = NO;那么点击黄色的view或者蓝色的view所产生的事件,最终会由橙色的view处理,橙色的view就会成为最合适的view。

所以,不管视图能不能处理事件,只要点击了视图就都会产生事件,关键在于该事件最终是由谁来处理!

上一篇 下一篇

猜你喜欢

热点阅读