web-dev-qa-db-fra.com

Comment puis-je demander à un UIGestureRecognizer d'annuler un contact existant?

J'ai un UIPanGestureRecognizer que j'utilise pour suivre un objet (UIImageView) sous le doigt d'un utilisateur. Je me soucie uniquement du mouvement sur l'axe des X. Si le contact reste au-dessus ou au-dessous du cadre de l'objet sur l'axe des Y, je souhaite mettre fin au contact.

J'ai tout ce dont j'ai besoin pour déterminer si un contact est dans les limites Y de l'objet, mais je ne sais pas comment annuler l'événement de contact. Inverser la propriété cancelsTouchesInView de l'agent de reconnaissance ne semble pas faire ce que je veux.

Merci!

57
Josh French

Cette petite astuce fonctionne pour moi.

@implementation UIGestureRecognizer (Cancel)

- (void)cancel {
    self.enabled = NO;
    self.enabled = YES;
}

@end

De la documentation UIGestureRecognizer @enabled:

Désactive un identificateur de geste pour le rendre ne reçoit pas de touches. Le défaut la valeur est oui. Si vous changez cela propriété à NON pendant un geste Le logiciel de reconnaissance reconnaît actuellement un geste, reconnaissance de geste transitions vers un état annulé.

148
Matej Bukovinski

La réponse de @ matej dans Swift.

extension UIGestureRecognizer {
  func cancel() {
    isEnabled = false
    isEnabled = true
  }
}
10
Hlung

Obj-C:

recognizer.enabled = NO;
recognizer.enabled = YES;

Swift 3:

recognizer.isEnabled = false
recognizer.isEnabled = true
7
budidino

Que diriez-vous de la docs Apple :

@property(nonatomic, getter=isEnabled) BOOL enabled

Désactive un dispositif de reconnaissance de geste pour qu’il ne reçoive pas de touches. La valeur par défaut est OUI. Si vous définissez cette propriété sur NO alors qu'un identificateur de mouvements est en train de reconnaître un geste, celui-ci passe à l'état annulé.

3
Ying

Vous avez deux façons de gérer ceci:

  1. Si vous étiez en train d'écrire une sous-classe de reconnaissance de geste panoramique personnalisée, vous pouvez facilement le faire en appelant -ignoreTouch:withEvent: depuis l'intérieur de la reconnaissance, lorsque vous la remarquerez s'éloigner de la zone qui vous tient à cœur.

  2. Puisque vous utilisez la reconnaissance de panoramique standard et que vous appuyez sur le bouton démarre OK (pour que vous ne vouliez pas l’empêcher avec les fonctions de délégué), vous ne pouvez vraiment faire la distinction que lorsque vous recevez les actions cibles du reconnaisseur. . Vérifiez la valeur Y des valeurs de retour translationInView: ou locationInView: et fixez-la correctement.

0
Ben Zotto

Selon la documentation, vous pouvez sous-classer votre reconnaissance de geste:

Dans YourPanGestureRecognizer.m:

#import "YourPanGestureRecognizer.h"

@implementation YourPanGestureRecognizer

- (void) cancelGesture {
    self.state=UIGestureRecognizerStateCancelled;
}

@end

Dans YourPanGestureRecognizer.h:

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

@interface NPPanGestureRecognizer: UIPanGestureRecognizer

- (void) cancelGesture;

@end

Maintenant, vous pouvez appeler si de n'importe où

YourPanGestureRecognizer *panRecognizer = [[YourPanGestureRecognizer alloc] initWithTarget:self action:@selector(panMoved:)];
[self.view addGestureRecognizer:panRecognizer];
[...]
-(void) panMoved:(YourPanGestureRecognizer*)sender {
    [sender cancelGesture]; // This will be called twice
}

Réf.: https://developer.Apple.com/documentation/uikit/uigesturerecognizer?language=objc

0
Rémy Blanc