ios触摸事件

2018-06-13  本文已影响20人  721e472431a4

                                                    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也不处理该事件,则丢弃该事件。

注:更多细节处理可参考文章触摸事件详解

上一篇下一篇

猜你喜欢

热点阅读