一、知识点简介、
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)。
主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件。
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。
所以,不管视图能不能处理事件,只要点击了视图就都会产生事件,关键在于该事件最终是由谁来处理!
网友评论