iOS--触碰响应UIResponder UIGestureRecognizer

来源:互联网 发布:clear my mac激活码 编辑:程序博客网 时间:2024/06/05 15:05

疯狂iOS讲义总结


一、在iOS中,触碰的响应是以响应者链的形式进行的。也就是说,当用户和某个控件交互时,该控件会成为第一响应者(First Responder),第一响应者作为响应者链的开始,交互交互事件会首先被发送给第一响应者,事件会沿着响应者链一致向下传播,知道被某个响应者处理。

事件响应者链的典型传播路线如下:

First Responder --> First Responder的视图控制器(如果有) --> 父容器(如果有) --> 父容器的视图控制器(如果有) --> UIWindow --> UIApplication --> 应用程序委托对象。


二、响应触碰方法:自定义控件可以响应用户的触碰事件,通过UIResponder的以下4个方法:

- touchesBegin: (NSSet*) touches withEvent: (UIEvent*) event:当用户手指开始接触控件或窗口事件时激发该方法

- touchesMoved: (NSSet*) touches withEvent: (UIEvent*) event:当用户手指在控件上移动时激发该方法

- touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event:当用户手指结束触碰控件时激发该方法

- touchesCancelled: (NSSet*) touches withEvent: (UIEvent*) event:当系统事件(比如内存低事件)中止了触碰事件时激发该方法。


第一个NSSet类型的参数代表了用户同时触碰控件的多个手指,如果该用户用3个手指触碰了该控件,那么该touches参数中将会包含3个UITouch对象。

UITouch对象代表一个触碰事件,该对象提供一个tapCount属性,该属性用于返回用户触碰屏幕的次数。此外,UITouch还提供了locationInView: 方法来获取该触碰事件在UIVIew控件中的触碰位置。


三、手势处理器(UIGestureRecognizer)

UITapGestureRecognizer:处理用户点击手势的手势处理器

UIPinchGestureRecognizer:处理用户捏合手势的手势处理器

UIRotationGestureRecognizer:处理用户旋转手势的手势处理器

UISwipeGestureRecognizer:处理用户滑动手势的手势处理器

UIPanGestureRecognizer:处理用户拖动手势的手势处理器

UILongPressGestureRecognizer:处理用户长按手势的手势处理器


使用手势处理器处理用户触碰手势的编程步骤:

1)根据程序要处理的手势创建对应的手势处理器对象。创建手势处理器时需要指定target和action参数--当该控件上发生触碰手势后,该target对象的action方法将会被激发。

2)如果该UI控件不允许用户交互,则将该UI控件的userInteractionEnabled属性设为YES;如果希望该控件支持多点触碰,还需要将mutipleTouchEnabled设为YES。

2)调用UI控件的addGestureRecognizer: 方法添加该手势处理器。

UIgestureRecognizer作为所有手势处理器的基类,它提供如下常用的方法和属性。

1) - locationInView: (UIView*) view:返回该手势在view控件中的触碰位置。

2) - locationOfTouch: (NSUInteger) touchIndex inView: (UIView*) view:返回该手势中第touchIndex个触碰点在view控件中的触碰位置。

3) - numberOfTouches:返回该手势包含触碰点的数量(也就是用户用了几个手指进行触碰)。

4) view:返回激发该手势的UI控件

5) enabled:用于设置和返回该手势处理器是否可用

6) state:获取该手势所处的状态,比如手势刚开始时处于UIGestureRecognizerStateBegin状态,手势结束时处于UIGestureRecognizerStateEnded状态。


各个手势处理独自的属性

UITapGestureRecognizer

1)numberOfTapsRequired:指定该手势处理器只处理几次触碰事件

2)numberOfTouchesRequired:指定该手势处理器只处理几个手指的触碰事件。

UIPinchGestureRecognizer

1)scale:获取捏合的比例

2)velocity:获取捏合的速度

UIRotationGestureRecognizer

1)rotation:获取旋转角度

2)velocity:获取旋转速度

UISwipeGestureRecognizer

1)direction:设置该手势处理器处理该方向的轻扫、该属性支持UISwipeGestureRecognizerDirectionRight(1<<0)、UISwipeGestureRecognizerDirectionLeft(1<<1)、UISwipeGestureRecognizerDirectionUp(1<<2)、UISwipeGestureRecognizerDirectionDown(1<<3)4个枚举值。

2)numberOfTouchesRequired:指定该手势处理器只处理几个手指的触碰事件。

UIPanGestureRecognizer

1)maximumNumberOfTouches:设置该拖动手势处理器最多支持几个手指拖动

2)minimumNumberOfTouches:设置该拖动手势处理器最少需要几个手指一起拖动。

3)- translationInView::获取该拖动手势在指定控件上的位移。该方法返回一个CGPoint结果体数据,该结构体中x变量的值代表了水平方向的位移,y变量的值代表了垂直方向的位移。

4)- velocityInView::获取该拖动手势在指定控件上的拖动速度。该方法返回一个CGPoint结果体数据。该结构体中x变量的值代表了水平方向的速度,y变量的值代表了垂直方向的速度。

UILongPressGestureRecognizer

1)minimumPressDuration:指定用户至少在屏幕上按下多少秒才会触发该长按手势。该属性默认值为0.5。

2)numberOfTouchesrequired:指定必须使用几个手指在屏幕上长按才会触发该手势。

3)allowableMovement:指定该长按手势允许用户移动手指的最大距离。如果用户手指按下时移动超过了该距离,则长按手势失败。


四、自定义手势处理器

具体步骤:

1)创建继承UIGestureRecognizer的子类

2)重写UIGestureRecognizer基类的触碰相关的4个方法。通过在这些方法中识别用户手势划过的痕迹--当用户手指划过的痕迹符合手势要求时,程序将该手势的state设为UIgestureRecognizerStateEnded即可,否则设为UIGestureRecognizerStateCancelled作为手势失败。


0 0