iOS Custom Gesture Recognizer仅适用于第一次

时间:2012-07-18 11:48:48

标签: ios uigesturerecognizer

我正在尝试使用documentation中的复选标记手势识别器示例,但它仅在我第一次进行手势时才有效。在识别之后,它不再起作用。

我正在使用以下代码:

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

关于我做错了什么的任何想法?

由于

3 个答案:

答案 0 :(得分:2)

我的手势识别器有类似的问题。似乎UIGestureRecognizer不会调用您的类的“重置”方法,也不会将“state”属性设置为UIGestureRecognizerStatePossible。

我知道有两种方法可以让它发挥作用:

  1. 您可以在touchesEnded方法中自行将状态属性设置为UIGestureRecognizerStatePossible。但这似乎不对。
  2. 您可以使用UIGestureRecognizer的状态属性而不是您自己的状态。即到处都使用super.state而不是self.state。

答案 1 :(得分:0)

查看此代码。它适用于我。 https://github.com/shahidnasrullah/CustomZGestureIOS.git

答案 2 :(得分:0)

尝试删除实施中的@synthesize state;行。这已经在超类中完成了。

您也不必将UIGestureRecognizerSubclass.h中的所有定义复制到头文件中。最好的是删除它。