iphone – 创建自定义UIGestureRecognizer

我已经创建了几个自定义UIGestureRecognizer而没有问题.我决定我想要一个自定义版本的单击手势,并继续子类化UIGestureRecognizer.除了一个问题,一切似乎都很好.在我的动作处理程序[gestureRecognizer locationInView:self]中,x和y都返回零.当我回到UITapGestureRecognizer时,动作处理程序工作正常.这必须与子类手势识别器有关,这是我的代码:

#import "gr_TapSingle.h"

#define tap_Timeout 0.25

@implementation gr_TapSingle


- (id)init
{
    self = [super init];
    if ( self )
    {
    }
    return self;
}

- (void)reset
{
}

-(void)gesture_Fail
{
    self.state = UIGestureRecognizerStateFailed;
}

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesBegan:touches withEvent:event];

    if ( [self numberOfTouches] > 1 )
    {
        self.state = UIGestureRecognizerStateFailed;
        return;
    }

    originLocation = [[[event allTouches] anyObject] locationInView:self.view];

    [self performSelector:@selector(gesture_Fail) withObject:nil afterDelay:tap_Timeout];
}

-(void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesMoved:touches withEvent:event];

    if ( self.state == UIGestureRecognizerStatePossible )
    {
        CGPoint l_Location = [[[event allTouches] anyObject] locationInView:self.view];
        CGPoint l_Location_Delta = CGPointMake( l_Location.x - originLocation.x, l_Location.y - originLocation.y );
        CGFloat l_Distance_Delta = sqrt( l_Location_Delta.x * l_Location_Delta.x + l_Location_Delta.y * l_Location_Delta.y );
        if ( l_Distance_Delta > 15 )
            self.state = UIGestureRecognizerStateFailed;
        return;
    }
}

-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesEnded:touches withEvent:event];

    if ( self.state == UIGestureRecognizerStatePossible )
        [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(gesture_Fail) object:nil];

    if ( self.state != UIGestureRecognizerStateFailed )
        self.state = UIGestureRecognizerStateEnded;
}

-(void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
    [super touchesCancelled:touches withEvent:event];
    if ( self.state == UIGestureRecognizerStatePossible )
        [[self class] cancelPreviousPerformRequestsWithTarget:self selector:@selector(gesture_Fail) object:nil];
    self.state = UIGestureRecognizerStateFailed;
}

@end

最佳答案 Apple的文档说:

The returned value is a generic single-point location for the gesture
computed by the UIKit framework. It is usually the centroid of the
touches involved in the gesture. For objects of the
UISwipeGestureRecognizer and UITapGestureRecognizer classes, the
location returned by this method has a significance special to the
gesture. This significance is documented in the reference for those
classes.

所以我假设每个子类都有它自己的特殊实现方法,适合它自己的专业.因此,如果要创建子类UIGestureRecognizer,则必须自行实现.

编辑:

就像是:

- (CGPoint)locationInView:(UIView *)view
{
   if(view == self.view)
   {
      return originLocation;
   }
   else
   {
     //you decide
   }
}
点赞