0

ドキュメントでチェックマーク ジェスチャ レコグナイザーの例を使用しようとしていますが、初めてジェスチャを作成したときにのみ機能します。それを認識した後、それは再び動作しません。

私は次のコードを使用しています:

CheckmarkGestureRecognizer.h

#import <UIKit/UIKit.h>
#import <UIKit/UIGestureRecognizerSubclass.h>

@interface Checkmark2GestureRecognizer : UIGestureRecognizer {
    BOOL strokeUp ;
}


- (void)reset;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

@property (nonatomic,readwrite) UIGestureRecognizerState state;
@property (nonatomic,assign) CGPoint midPoint;
@end

CheckmarkGestureRecognizer.m

#import "Checkmark2GestureRecognizer.h"


@implementation Checkmark2GestureRecognizer

@synthesize state;
@synthesize midPoint;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
            NSLog(@"began");
    strokeUp = NO;
    if ([touches count] != 1) {
        self.state = UIGestureRecognizerStateFailed;
        return;
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesMoved:touches withEvent:event];
    if (self.state == UIGestureRecognizerStateFailed) return;
    CGPoint nowPoint = [[touches anyObject] locationInView:self.view];
    CGPoint prevPoint = [[touches anyObject] previousLocationInView:self.view];
    if (!strokeUp) {
        // on downstroke, both x and y increase in positive direction
        if (nowPoint.x >= prevPoint.x && nowPoint.y >= prevPoint.y) {
            self.midPoint = nowPoint;
            // upstroke has increasing x value but decreasing y value
        } else if (nowPoint.x >= prevPoint.x && nowPoint.y <= prevPoint.y) {
            strokeUp = YES;
        } else {
            self.state = UIGestureRecognizerStateFailed;
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    if ((self.state == UIGestureRecognizerStatePossible) && strokeUp) {
        self.state = UIGestureRecognizerStateRecognized;
            NSLog(@"Ended");
    }

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    self.midPoint = CGPointZero;
    strokeUp = NO;
    self.state = UIGestureRecognizerStateFailed;
    NSLog(@"cancelled");
}

- (void)reset {
    [super reset];
    NSLog(@"reset");
    self.midPoint = CGPointZero;
    strokeUp = NO;
}

@end

私が間違っていることについて何か考えはありますか?

ありがとう

4

3 に答える 3

2

独自のジェスチャ認識エンジンにも同様の問題があります。UIGestureRecognizer は、クラスの「リセット」メソッドを呼び出さず、「状態」プロパティを UIGestureRecognizerStatePossible に設定していないようです。

私はそれを機能させる2つの方法を知っています:

  1. touchesEnded メソッドで state プロパティを UIGestureRecognizerStatePossible に自分で設定できます。しかし、それは間違っているようです。
  2. 独自の状態の代わりに UIGestureRecognizer の状態プロパティを使用できます。つまり、どこでも self.state の代わりに super.state を使用します。
于 2012-08-07T13:56:07.990 に答える
0

このコードをチェックしてください。それは私とうまく動作します。 https://github.com/shahidnasrullah/CustomZGestureIOS.git

于 2013-06-11T05:42:11.463 に答える