iOS事件分发机制与实践事件分发机制与实践
iOS事件的传递与响应是一个重要的话题,网上谈论的很多,但大多讲述并不完整,本文将结合苹果官方的文档对事件的传递
与响应原理及应用实践做一个比较完整的总结。文章将依次介绍下列内容:
事件的传递机制
事件的响应机制
事件传递与响应实践
手势识别器工作机制
iOS中事件一共有四种类型,包含触摸事件,运动事件,远程控制事件,按压事件,本文将只讨论最常用的触摸事件。事件通
过UIEvent对象描述
UIEvent
UIEvent描述了单次的用户与应用的交互行为,例如触摸屏幕会产生触摸事件,晃动手机会产生运动事件。UIEvent对象中记
录了事件发生的时间,类型,对于触摸事件,还记录了一组UITouch对象,下面是UIEvent的几个属性:
@property(nonatomic,readonly) UIEventType type
NS_AVAILABLE_IOS(3_0); //事件的类型
@property(nonatomic,readonly) UIEventSubtype subtype
NS_AVAILABLE_IOS(3_0);
@property(nonatomic,readonly) NSTimeInterval timestamp; //事件的时
间
@property(nonatomic, readonly, nullable) NSSet <UITouch *>
*allTouches; //事件包含的touch对象
那么触摸事件中的UITouch对象描述的是什么呢?
UITouch
UITouch记录了手指在屏幕上触摸时产生的一组信息,包含触摸的时间,位置,所在的窗口或视图,触摸的状态,力度等信息
@property(nonatomic,readonly) NSTimeInterval timestamp; //时间
@property(nonatomic,readonly) UITouchPhase phase; //状态,例如
begin,move,end,cancel
@property(nonatomic,readonly) NSUInteger tapCount; // 短时间内单击
的次数
@property(nonatomic,readonly) UITouchType type
NS_AVAILABLE_IOS(9_0); //类型
@property(nonatomic,readonly) CGFloat majorRadius
NS_AVAILABLE_IOS(8_0); //触摸半径
@property(nonatomic,readonly) CGFloat majorRadiusTolerance
NS_AVAILABLE_IOS(8_0);
@property(nullable,nonatomic,readonly,strong) UIWindow *window; //触
摸所在窗口
@property(nullable,nonatomic,readonly,strong) UIView *view; //触摸所在
视图
@property(nullable,nonatomic,readonly,copy) NSArray
<UIGestureRecognizer *> *gestureRecognizers
NS_AVAILABLE_IOS(3_2); //正在接收该触摸对象的手势识别器
@property(nonatomic,readonly) CGFloat force
NS_AVAILABLE_IOS(9_0); //触摸的力度
每一根手指的触摸都会产生一个UITouch对象,多个手指触摸便会有多个UITouch对象,当手指在屏幕上移动时,系统会更新
UITouch的部分属性值,在触摸结束后系统会释放UITouch对象。
当事件产生后,系统会寻找可以响应该事件的对象来处理事件,如果找不到可以响应的对象,事件就会被丢弃。那么哪些对象
可以响应事件呢?只有继承于UIResponder的对象才能够响应事件,UIApplication,UIView,UIViewcontroller均继承于
UIResponder,因此它们能够响应事件。UIResponder提供了响应事件的一组方法: