iOS学习之多点触碰

一、响应者链

       只要继承了UIResponder的对象就可作为事件的响应者,实际上UIControl继承了UIView,UIView又继承了UIResponder,即所有的对象都可作为事件的响应者。

       当用户与某个空间交互时,该空间将作为”第一响应者(First Responder)”,第一响应者将作为响应者链的开始,该事件首先被发送给第一响应者(也就是用户触摸屏幕的控件)。事件将沿着响应者链一直向下传播,直到被某个响应者处理。

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

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

       如果某个事件经过上面完整的传播过程,依然没有被处理,那么该事件就会被丢弃。一般来说,上面响应者链的任何响应者处理该事件,该事件就会停止传播。

       如果某个响应者”截获”了某个时间,那么该响应者要根据条件决定是否处理该事件。当响应者无法处理该事件时,则需要在处理方法中手动传递该事件。

       eg:

-(void)handleTapEvent:(UIEvent *)event
{
   if(condition)
   {
       //处理事件
   }
   else
   {
       [self.nextResponder handleTapEvent:event];
   }
}

二、响应触摸方法

       UIResponder的4个方法可以让自定义控件响应用户的触碰事件:

-touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event: //当用户手指开始接触控件或窗口事件时激发该方法
-touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event: //当用户手指在控件上移动时激发该方法
-touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event: //当用户手指结束触碰控件时激发该方法
-touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event: //当系统事件(比如内存低事件)中止了触碰事件时激发该方法

       如果希望用户在控件上按下手指激发响应的事件,则可通过重写如下方法来实现:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   NSUInteger fingersNum = [touches count];
   NSUInteger tapCount = [[touches anyObject] tapCount]
   ...
}

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

       UITouch对象代表一个触碰事件,该对象提供了一个tapCount属性,该属性用于返回用户触碰屏幕的次数,比如用户只是轻轻触碰屏幕一次,那么该属性将会返回1.如果该属性返回3,则代表用户快速触碰了3次屏幕。如果touches集合包含3个元素,而且tapCount属性返回3,就代表用户使用了3个手指触碰了3次控件。除此之外,UITouch还提供了locationInView:方法来获取该触碰时间在UIView控件中的触碰位置。

三、使用手势处理器(UIGestureRecognizer)

详见:http://blog.csdn.net/yxys01/article/details/51595260

       UIGestureRecognizer合集:
       UIGestureRecognizer
       UITapGestureRecognizer
       UIPinchGestureRecognizer
       UIRotationGestureRecognizer
       UISwipeGestureRecognizer
       UIPanGestureRecognizer
       UILongPressGestureRecognizer

你可能感兴趣的:(iOS学习,iOS学习--从入门到实战)