Events(iOS)

Introduction

在iOS中,event表示当手指触摸应用的view或者摇晃手机产生的行为。一个或者多个手指触摸到一个或者多个view,手指有可能在view上移动,然后离开view。当发生触摸行为时,iPhone的多点触控系统会把这些触摸行为注册成一个个的事件,然后发送给当前进程中处于活动状态的应用。从第一根手指触摸到屏幕到最后一根手指离开屏幕,这期间所有的触摸行为组成多点触摸队列。应用(和框架里的对象)会分析多点触摸队列,判断他们是捏合手势还是滑动手势。

当用户摇晃手机时,手机的操作系统也会生成运动事件(motion events),作为离散事件分发给应用。

事件分发路径

如图:
Mou icon

  1. 在主事件循环中,应用从事件队列中获取到触摸事件,把他们打包成包装在UIEvent 对象中的UITouch对象;
  2. 然后发送到触摸产生的窗口中。
  3. 窗口再把这些事件发送给接受事件的控件(hit-test返回的view)。
  4. 如果这个控件不能处理事件,则按照响应者链条继续传递事件,直到事件被处理或者被丢弃。

处理触摸事件

重写下面的方法来处理触摸事件

•    touchesBegan:withEvent:手指触摸开始
•    touchesMoved:withEvent:手指移动
•    touchesEnded:withEvent:手指离开屏幕
•    touchesCancelled:withEvent:当发生一些外部事件—比如,收到来电-会导致系统取消多点触摸队列中的触摸事件.

参数:

  1. 上面所有方法的第一个参数是一个包含当前阶段的所有触摸(UITouch)对象的无序数组
  2. 第二个参数是一个 UIEvent 对象,用于追踪当前多点触摸队列中所有的触摸对象。

注意:默认情况下,一个view是可以接受多点触摸事件的。但是,有一些UIKit控件的类,userInteractionEnabled这个属性为NO,所以接受不到触摸事件。如果想要接受事件,需要设置为YES。

处理运动事件

操作系统可以通过手机中的加速器来监测到特定的运动行为,然后把它们发送到处于活跃状态的应用。(当前唯一支持的运动行为是摇晃手机)系统会告诉应用运动事件何时开始和结束:
motionBegan:withEvent: and motionEnded:withEvent:.
能接收到的有用信息有:event type(UIEventTypeMotion),event subtype (, UIEventSubtypeMotionShake),和 timestamp(时间戳)