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!
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é.
La réponse de @ matej dans Swift.
extension UIGestureRecognizer {
func cancel() {
isEnabled = false
isEnabled = true
}
}
Obj-C:
recognizer.enabled = NO;
recognizer.enabled = YES;
Swift 3:
recognizer.isEnabled = false
recognizer.isEnabled = true
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é.
Vous avez deux façons de gérer ceci:
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.
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.
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