事件概述:
• 事件是当⽤户⼿指触击屏幕及在屏幕上移动时,系统不断发送给应⽤程序的对象。
• 系统将事件按照特定的路径传递给可以对其进⾏处理的对象。
• 在iOS中,⼀个UITouch对象表⽰⼀个触摸,⼀个UIEvent对象表⽰⼀个事件。事件对象中包含与当前多点触摸序列相对应的所有触摸对象,还可以提供与特定视图或窗⼝相关联的触摸象。
触摸概述:
触摸信息有时间和空间两⽅⾯,时间⽅⾯的信息称为阶段(phrase),表⽰触摸是否刚刚开始、是否正在移动或处于静⽌状态,以及何时结束—也就是⼿指何时从屏幕抬起。触摸信息还包括当前在视图或窗⼝中的位置信息,以及之前的位置信息(如果有的话)。当⼀个⼿指接触屏幕时,触摸就和某个窗⼝或视图关联在⼀起,这个关联在事件的整个⽣命周期都会得到维护。
触摸事件的处理方法:
• 在给定的触摸阶段中,如果发⽣新的触摸动作或已有的触摸动作发⽣变化,应⽤程序就会发送这些消息:
当⼀个或多个⼿指触碰屏幕时,发送 touchesBegan:withEvent:消息。
当⼀个或多个⼿指在屏幕上移动时,发送touchesMoves:withEvent:消息。
当⼀个或多个⼿指离开屏幕时,发送touchesEnded:withEvent:消息。
响应者链:
• 响应者链是⼀个响应者对象的连接序列,事件或动作消息(或菜单编辑消息)依次传递。它允许响应者对象把事件处理的职责转交给其它更⾼层的对象。应⽤程序通过向上传递⼀个事件来查找合适的处理对象。因为点击检测视图也是⼀个响应者对象,应⽤程序在处理触摸事件时也可以利⽤响应链。
• 由多个响应者对象组成的链。
响应者:
• iOS中所有能响应事件(触摸、晃动、远程事件)的对象都是响应者。
• 系统定义了⼀个抽象的⽗类UIResponder来表⽰响应者。其⼦类都是响应者。
检测碰撞视图:
• 硬件检测到触摸操作,会将信息交给UIApplication,开始检测。
• UIApplication -> window-> viewController -> view -> 检测所有⼦视图
• 最终确认触碰位置,完成响应者链的查询过程。
处理触摸事件:
• 检测到响应者后, 实现 touchesBegan:withEvent: 等方法, 即处理事件.
• 如果响应者没有处理事件,事件会向下传递。如果没有响应者处理,则丢弃触摸事件。
• 事件处理的顺序与触摸检测查询相反。
• 触摸的⼦视图 -> view-> viewController -> window ->UIApplication
阻断响应者链:
• 响应者链可以被打断。⽆法完成检测查询过程。
• 视图类的属性 : userInteractionEnabled。关闭后能阻断查询过程。
响应者链处理原则:
• 点击检测视图或者第⼀响应者传递事件或动作消息给它的视图控制器(如果它有的话);如果没有⼀个视图控制器,就传递给它的⽗视图。
• 如果⼀个视图或者它的视图控制器不能处理这个事件或动作消息,它将传递给该视图的⽗视图.
• 在这个视图层次中的每个后续的⽗视图遵循上述的模式,如果它不能处理这个事件或动作消息的话。
• 最顶层的视图如果不能处理这个事件或动作消息,就传递给UIWindow对象来处理。
• 如果UIWindow 对象不能处理,就传给单件应⽤程序对象UIApplication如果应⽤程序对象也不能处理这个事件或动作消息,将抛弃它。
手势
手势识别器概述:
• ⼿势识别器是对触摸事件做了封装,⼿势识别器本⾝起到了识别作⽤。
• ⼿势识别器是iOS中⽐较抽象的⼀个类,⽤于识别⼀个⼿势,所谓⼿势:有规律的触摸。
轻拍手势 平移手势 轻扫手势 缩放手势 旋转手势 长按手势 屏幕边界平移手势等.
使用手势识别器:
系统提供的手势识别器这个抽象父类我们不会直接使用的, 而是根据需要求使用特定的手势识别器创建对象, 系统所提供的手势类型如下:
1.UITapGestureRecognizer是轻拍⼿势识别器,能识别轻拍操作
2.UILongPressGestureRecognizer是长按⼿势识别器,能识别长按操作
3.UIRotationGestureRecognizer是旋转⼿势识别器,能识别旋转操作
4.UIPinchGestureRecognizer是捏合⼿势识别器,能识别捏合操作
5.UIPanGestureRecognizer是平移⼿势识别器,能识别拖拽操作
6.UISwipeGestureRecognizer是轻扫⼿势识别器,能识别拖拽操作
7.UIScreenEdgePanGestureRecognizer是屏幕边缘轻扫识别器