繁体   English   中英

iOS Custom Gesture Recognizer仅适用于第一次

[英]iOS Custom Gesture Recognizer works only first time

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

我正在使用以下代码:

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

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

谢谢

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

我知道有两种方法可以使它工作:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM