1 前言

    今天我们来学习IOS中的事件,主要是用户触摸事件。

2 详述

    IOS中代表性的事件有手指触摸应用的视图或者用户摇晃设备。一个或者多个手指触摸一个或者多个视图,可能移动,然后从视图抬起。当事件发生的时候,iPhone的多重触摸系统存储这些触摸作为事件并且发送他们到当前活动的运行的应用。它规定了可能的触摸行为的范围,从第一个带有特征的触摸在视图中按下的时候知道最后一个手指离开视图,定义了一个多重触摸的队列。应用程序(和框架对象)分析多重触摸的队列,常常用来决定他们是否是捏或者滑动的手势。

   当用户摇晃设备的时候操作系统也可能生成动作事件,这些会被作为不连续的事件传送给应用程序。

2.1 代表手指触摸屏幕的对象

    手指触摸视图的代表事件为UITouch事件,触摸事件包括信息例如手指正在触摸的视图,手指所在视图中的位置,时间戳和阶段。触摸对象经历了多个阶段当一个多触摸队列位于已给定的规则中:

UITouchPhaseBegan

手指按下视图

UITouchPhaseMoved

手指在当前视图或者临近的视图上移动

UITouchPhaseEnded

手指离开视图

    一个触摸对象可以是特殊的阶段或者被取消。触摸对象可以持续的通过一个多重触摸的序列,但是他们的状态是变化的,一个应用程序打包触摸对象通过UIEvent事件,当交付他们到一个视图进行处理的时候。

ios dispatch_source_set_timer 关闭 iphone取消events_触摸

2.2 触摸事件的交付要遵循一个定义的路径

    在主事件循环中,应用程序对象得到触摸事件在它的事件队列中,打包他们作为UITouch对象在UIEvent对象中,然后发送他们到触摸事件发生的视图的窗口。窗口对象,轮流的发送这些对象到这个被熟知的点击-测试视图。如果这个视图不能处理触摸事件(通常是因为它没有实现所必须的事件处理方法),这个事件就会在响应链中传递下去直到它被处理或者被丢弃。

2.3 我们必须重写四个方法来处理事件

    包含自定义视图和视图控制器的响应对象,处理事件通过实现四个方法被UIResponder类所声明的:

·touchesBegan:withEvent:在触摸对象开始阶段被调用;

·touchesMoved:withEvent:在触摸对象移动时候被调用;

·touchesEnded:withEvent:在触摸对象结束的时候被调用;

·touchesCancelled:withEvent:在外部事件被调用的时候--例如,来电时候--引起操作系统取消触摸对象在多重触摸的队列中。

    每个方法的第一个参数是所设定的在给定的阶段。第二个参数是追踪所有触摸对象在当前的多重触摸队列中的UIEvent对象。

    通常的,视图能够接收到复合触摸事件。然而一些UIKit视图类的实例,不能够接收复合事件因为他们的userInteractionEnabled属性被设置为NO。如果继承这些类,并且希望接受事件,确定设置这个属性为YES。尽管自定义的视图和视图控制器应该实现所有的方法,UIKit视图类的子类仅仅需要实现不同阶段相应的方法。然而,他们必须确保先调用父类的实现方法。

2.4 处理动作事件

    通过设备加速器,操作系统发现特殊的动作并且发送这些事件到活动的应用程序。(当前只支持晃动设备)第一响应者首先接受这些动作事件(作为UIEvent对象)并且如果他不能处理他们,这些事件将会向响应链传递下去。系统告诉应用程序仅仅当动作开始的时候和结束的时候。响应的UIResponder方法为motionBegan:withEvent: 和 motionEnded:withEvent:。唯一的信息传递给响应对象的是封装的数据通过事件对象(event object):事件类型(比如UIEventTypeMotion),事件的子类型(比如 UIEventSubtypeMotionShake)和时间戳。

3 结语

    以上是所有内容,希望对大家有所帮助。