响应链和手势


Cocoa Touch没有公开任何代表手势的类或结构。一个手势就是一个动作,运行中的应用程序可以从用户输入流知道是否出现某种手势。


手势识别器(UIGestureRecognizer)是一个对象,它知道如何观察用户生成的事件流,并识别用户何时以与预定义的手势相匹配的方式进行了触摸和拖动。


1. 响应事件

响应者:以UIResponder作为超类的任何类都是响应者。UIView是UIResponder的子类,UIControl是UIView的子类,所以所有视图和所有空间都是响应者。UIViewController也是UIResponder的子类,它也是响应者,(UINavigationController & UITabBarController也是)。如果第一个响应者不处理某个特殊事件(如某个手势),那么它将事件传递到响应链的下一级。如果该链中的下一个对象响应此特殊事件,则处理该事件,并停止该事件的传递。如果此事件在整个响应链都没有对象来处理,则该事件被丢弃。


具体理解响应者链:

第一响应者几乎都是视图或者控件,并且首先对事件进行响应。如果第一响应者不处理该事件,那么它将该事件传递给其视图控制器。如果此视图控制器不处理该事件,那么该事件被传递给第一响应者的父视图。如果父视图没有响应,该事件传递给父视图控制器(如果有)。

该事件沿着每个视图的层次结构继续前进,然后该视图的控制器获得处理该事件的机会。如果一直没有对象对该事件进行处理,该事件将传递给应用程序的窗口。如果窗口也不处理,事件将传递到应用程序的对象实例UIApplication。如果UIApplication也不处理,最后就是应用程序委托。应用程序委托是UIResponder的子类的话,那应用程序就尝试将任意尚未处理的事件传递给它。如果不是,或者不处理,事件将被丢弃。


2.转发事件:保持响应者链的活动状态

- (void)respondToFictionalEvent:(UIEvent *)event
{
     if ([self shouldHandleEvent:event]) {
         [self handleEvent:event];
     } else {
         [[self nextResponder] respondToFictionalEvent:event];
     }
}

如果当前对象不处理事件的响应,我们需要确保将该事件推回到响应者链中。


3.触控体系结构

手势沿着响应者链传递,并且嵌入在事件中。所以响应者链的对象中需要包含代码来处理手势事件。这意味着我们可以将代码嵌入UIView的子类中,也可以嵌入UIViewController中。


4.4个手势通知方法

touchesBegan:withEvent:

touchesMoved:withEvent:

touchesEnded:withEvent:

touchesCancelled:withEvent:  当发生某些事件(如来电)导致手势中断时,该方法被调用

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //touches中的每个对象都是一个UITouch事件
    
    NSUInteger numTaps = [[touches anyObject] tapCount];//快速连续轻击屏幕次数
    NSUInteger numTouches = [touches count];//同时轻击屏幕的手指数
    NSSet *myTouches = [event touchesForView:self.view];//获得特定视图的触摸touches
    CGPoint point = [touch locationInView:self];//特定手指的位置
}


你可能感兴趣的:(iOS,手势)