Custom gestureRecognizer qui ne trigger l'action qu'une seule fois

colas_colas_ Membre
août 2015 modifié dans API UIKit #1

Hello à  tous,


 


j'utilise pas mal UITapGestureRecognizer. Mais, l'action est trigger lorsque le touch est up. Je souhaiterais avoir un gestureRecognizer qui fasse la même chose mais au touch down.


 


La difficulté que je rencontre est que, bizarrement UITapGestureRecognizer n'appelle le target et la méthode action qu'une seule fois. J'ai l'impression que c'est un cas unique et que tous les autres recognizers appellent l'action sur le target à  chaque changement d'état (begin, modified, cancel, finished).


 


Je voudrais avoir la même fonctionnalité mais je n'y arrive pas. 


 


Voici mon code pour l'instant : quand on tap, il trigger deux fois l'action (une fois au begin, un fois au end)



@implementation CBDTouchDownGestureRecognizer



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

self.state = UIGestureRecognizerStateBegan ;
}



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

self.state = UIGestureRecognizerStateEnded ;
}


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

self.state = UIGestureRecognizerStateEnded ;
}



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

self.state = UIGestureRecognizerStateCancelled ;
}


@end

Réponses

  • colas_colas_ Membre
    août 2015 modifié #2

    Voilà  une solution où je triche un peu. ça se trouve, c'est ce que fait UITapGesture. J'ai ajouté au .m précédent :



    @interface CBDTouchDownGestureRecognizer ()

    @property (nonatomic, strong, readwrite) NSInvocation * invocation ;

    @end




    @implementation CBDTouchDownGestureRecognizer


    - (instancetype)initWithTarget:(id)target
    action:(SEL)action
    {
    self = [super initWithTarget:self
    action:@selector(recognizerDidChangeState:)] ;

    if (self)
    {
    /*
    Building the invocation that keeps the info
    (target and action)
    */
    NSInvocation * invocation ;
    invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]] ;
    invocation.target = target ;
    invocation.selector = action ;

    _invocation = invocation ;
    }

    return self ;
    }



    /**
    We use this trick to trigger the action only once
    */
    - (void)recognizerDidChangeState:(UIGestureRecognizer *)reco
    {
    if (reco.state == UIGestureRecognizerStateBegan)
    {
    [self.invocation invoke] ;
    }
    }


Connectez-vous ou Inscrivez-vous pour répondre.