ios触摸事件
ios触摸事件
一、前言
在App开发过程中,需要利用手势去实现一些功能或者效果。UIKit框架提供了检测常见手势的预定义手势识别器。在手势开发上,最好使用预定义的手势识别器,因为它们的简单性减少了我们的代码量。当然,我们也可以自定义一些特殊的手势,具体的可以查看官方文档。ios中事件可以分为3大类型:触摸事件、加速器事件、远程控制事件,如下图所示:
二、UIResponder
在ios中不是任何对象都能处理事件,只要继承了UIResponder的对象才能接收并处理事件。我们称之为"响应者对象",UIApplication,UIController,UIView都继承自UIResponder,因此它们都是响应者对象,都能接收并处理事件。
UIResponder提供了以下方法来处理事件:
三、UITouch
当用户一根手指头触摸到屏幕时,会创建一个与手指相关的UITouch对象,一根手指对应一个UITouch对象。
UITouch保存着与手指相关的信息, 比如触摸的位置,时间,阶段:
(1)当手指移动的时候,系统会更新同一个UITouch对象,使之能一直保存该手指在的触摸位置。
(2)当手指离开屏幕的时候,系统会销毁相应的UITouch对象。
UITouch的属性:
其中,UITouchPhase是一个枚举类型、包括:
UITouch的方法:
四:UIEvent
每产生一个事件,就会产生一个UIEvent对象,记录事件产生的时刻和类型。
UIEvent属性:
五:事件的产生和传递
发生触摸事件后,系统会将事件加入到一个由UIApplication管理的事件队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理。通常,先发送事件给程序的主窗口(keywindow),主窗口会在视图层级中找到一个最合适的视图来处理触摸事件,也就是说keywindow最先收到触摸事件。找到合适的视图后,就会调用视图控件的touches方法来做具体的事件处理:
touchesBegan…
touchesMoved…
touchedEnded…
这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件传给上一个响应者进行处理。示例如下:
触摸事件的传递是从父控件传递到子控件的:
(1)点击了绿色的view
UIApplication-->UIWindow-->白色-->绿色
(2)点击了蓝色的view
UIApplication-->UIWindow-->白色-->橙色-->蓝色
(3)点击了黄色的view
UIApplication-->UIWidow-->白色-->橙色-->蓝色-->黄色
注意:如果父视图不能接收触摸事件,那么子视图就不可能接收触摸事件。
UIView不接收触摸事件的三种情况:
(1)不接收用户交互
userInteractionEnabled = NO
(2)隐藏
hidden = YES
(3)透明
alpha = 0.0~0.01
六:响应者链条
响应者链条示意图:
(1)如果view的控制器存在,就传递给控制器;如果控制器的view不存在,则将其传递给它的父视图。
(2)在视图层次结构的最顶级视图,如果不能处理接收的事件,那么会将事件传递给Window处理。
(3)如果window也不处理事件,就将事件传递给UIApplication处理。
(4)如果UIApplication也不处理该事件,则丢弃该事件。
注:更多细节处理可参考文章触摸事件详解