系统会更新同一个UITouch对象

iOS目前支持三种类型的事件:触摸事件、运动事件和远程控制事件
这些事件使用UIEvent来表示
每个事件(UIEvent)都有一个与之关联的事件类型和子类型, 可以通过type和subType属性访问
触摸事件
ios中的触摸事件是基于多点触摸
不同的UIKit对象,对触摸手势的处理是不一样的
运动事件
当以特定方式移动设备(比如摇摆)时,就会产生运动事件
运动事件源自设备加速器
运动事件除了事件类型,子类型和时间戳之外,没有其他状态
处理事件必须实现 motionBegan:withEvent; motionEnabled:withEvent

在ios中触摸动作是指手指碰到屏幕或在屏幕上移动
不同的手势对应不同的触摸动作
事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对象
触摸信息有时间和空间两方面,时间方面的信息称为阶段,被封装在UIEvent中,其实就是开始,移动,结束等阶段

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

当用户用一根触摸屏幕时,会创建一个与手指相关联的UITouch对象,一根手指对应一个UITouch对象
当手指离开屏幕时,系统会销毁相应的UITouch对象
UITouch的作用
保存着跟手指相关的信息,比如触摸的位置、时间、阶段
当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置

事件发生后被封装成UIEvent对象放入事件队列
UIApplication对象会将事件从队列顶部取出,通过sendEvent:方法进行派发
派发者一般是当前交互窗口,UIWindow会通过sendEvent:继续派发
在派发过程中通过触碰测试(hitTest:withEvent:)方法来寻找事件的第一响应者,返回true则代表响应事件
UIWindow对象以消息的形式将事件发送给第一响应者(一般是UIView)

首先,最重要的一点是: 如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件
如何找到最合适的控件来处理事件?
当事件来到UIResponder对象时,先判断自己是否能接收触摸事件?
判断触摸点是否在自己身上?
从后往前遍历子控件,重复前面的两个步骤
如果没有符合条件的子控件,那么就自己最适合处理
可以看出,在寻找最合适响应者的过程中,子控件有优先处理事件的特权

你可能感兴趣的:(系统会更新同一个UITouch对象)