4

問題なくいくつかのカスタム UIGestureRecognizers を作成しました。シングル タップ ジェスチャのカスタム バージョンが必要だと判断し、UIGestureRecognizer のサブクラス化に取り掛かりました。1つの問題を除いて、すべて問題ないようです。私のアクション ハンドラ [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
4

1 に答える 1

2

Apple のドキュメントには次のように書かれています。

返される値は、UIKit フレームワークによって計算されたジェスチャの一般的な単一点の位置です。これは通常、ジェスチャに含まれるタッチの重心です。UISwipeGestureRecognizer および UITapGestureRecognizer クラスのオブジェクトの場合、このメソッドによって返される位置には、ジェスチャにとって特別な意味があります。この重要性は、これらのクラスのリファレンスに記載されています。

したがって、すべてのサブクラスには、このメソッドの独自の特別な実装があり、独自の専門分野に適合していると思います。したがって、サブクラス化する場合は、これを独自に実装する必要がありますUIGestureRecognizer

編集:

何かのようなもの:

- (CGPoint)locationInView:(UIView *)view
{
   if(view == self.view)
   {
      return originLocation;
   }
   else
   {
     //you decide
   }
}
于 2012-04-25T17:35:29.513 に答える