iOS的触摸事件

  在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件,我们称其为@''响应者对象''UIApplication,UIViewController,UIView都继承自UIResponder,因此他们都是响应者对象,能够处理事件。

UIResponder

  UIResponder内部提供了方法来处理事件

一次完整的触摸过程,会经历3个状态

UIView的触摸事件处理

1、开始触摸view,系统会调用view下面的方法:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

2、手指在View上移动,系统会调用下面的方法(随着手指的移动,会持续调用该方法)

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

3、触摸结束,系统会调用view的下面方法:

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

4、触摸结束前,某个系统事件(例如电话呼入)会打断触摸过程,系统会自动调用view下面的方法

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event;

四个触摸事件的处理方法中,都有NSSet * touches 和 UIEvent * event 两个参数

1、一次完整的触摸过程,只会产生一个事件对象,4个触摸方法都是同一event参数

 2、如果两根手指同时触摸一个view,那么view只会调用一次 touchesBegan:withEvent: 方法,touches参数中装着两个UITouch对象;

 3、如果这两根手指一前一后分开触摸同一个view,那么view会分别调用两次 touchesBegan:withEvent:方法, 并且每次调用时的touches参数只包含一个UITouch对象;

 4、根据touches中UITouch个数可以判断出使单点触摸还是多点触摸。

    提示:touches中存放的都是UITouch对象。

UIView不接收触摸事件的三种情况:

    1> 不接受用户交互 :userInteractionEnable = NO;

    2> 隐藏 :hidden = YES;

    3> 透明:alpha = 0.0 ~ 0.01

提示:UIImageView的userInteractionEnable默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的。

 

响应者链的事件传递过程:

    1> 如果view的控制器存在,就传递给控制器;如果控制器不存在,则将其传递给它的父视图;

    2> 在视图层次结构最顶级的视图,如果也不能处理收到的事件或消息,则其将事件或消息传递给window对象进行处理。

    3> 如果window对象也不处理,则其将事件或消息传递给UIApplication对象;

    4> 如果UIApplication也不能处理该事件或消息,则将其丢弃。

 

监听触摸事件的做法

    如果想监听一个view上面的触摸事件,之前的做法是:

    1> 自定义一个view;

    2> 实现view的touches方法,在方法内部实现具体处理代码。

    通过touches方法监听view触摸事件,有很明显的几个缺点:

    1> 必须得自定义view;

    2> 由于是在view内部的touches方法中监听触摸事件,因此默认情况下,无法让其他外界对象监听view的触摸事件;

    3> 不容易区分用户的具体手势行为。

posted @ 2016-03-28 18:24  逆的态度  阅读(143)  评论(0编辑  收藏  举报