Je souhaite ajouter une reconnaissance gestuelle simple à mon projet iPhone basé sur la vue. Les gestes dans toutes les directions (droite, bas, gauche, haut) doivent être reconnus.
Il est indiqué dans la documentation pour UISwipeGestureRecognizer:
Vous pouvez spécifier plusieurs directions en spécifiant plusieurs constantes UISwipeGestureRecognizerDirection à l'aide d'opérandes OR au niveau du bit. La direction par défaut est UISwipeGestureRecognizerDirectionRight.
Cependant pour moi cela ne fonctionne pas. Lorsque les quatre directions sont marquées par OU, seuls les balayages vers la gauche et vers la droite sont reconnus.
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight | UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
J'ai résolu ce problème en ajoutant quatre outils de reconnaissance à la vue, mais je suis curieux de savoir pourquoi cela n'a pas fonctionné comme annoncé dans la documentation?
- (void)viewDidLoad {
UISwipeGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionUp)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionDown)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleSwipeFrom:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[[self view] addGestureRecognizer:recognizer];
[recognizer release];
[super viewDidLoad];
}
-(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer {
NSLog(@"Swipe received.");
}
la source
Réponses:
On dirait qu'il y a un bug. Vous pouvez spécifier la ou les directions autorisées comme vous l'avez fait. Mais lorsque vous essayez d'accéder à la direction réelle qui a déclenché le balayage dans la méthode du sélecteur d'action, vous obtenez toujours le masque de bits que vous avez initialement défini (pour les directions autorisées).
Cela signifie que les vérifications de la direction réelle échoueront toujours lorsque plus d'une direction est autorisée. Vous pouvez le voir par vous-même assez facilement lorsque vous indiquez la valeur de «direction» dans la méthode de sélection (ie
-(void)scrollViewSwiped:(UISwipeGestureRecognizer *)recognizer
).A déposé un rapport de bogue (# 8276386) à Apple.
[Mise à jour] J'ai reçu une réponse d'Apple disant que le comportement fonctionne comme prévu.
Ainsi, par exemple, dans une vue de tableau, vous pouvez balayer vers la gauche ou la droite dans une cellule de vue de tableau pour déclencher la `` suppression '' (cela aurait des directions du geste de balayage définies à gauche et à droite)
Cela signifie que la solution de contournement d'origine est la manière dont elle est censée être utilisée. La propriété direction ne peut être utilisée que pour faire reconnaître correctement les gestes, mais pas dans la méthode effectuée sur une reconnaissance réussie pour comparer la direction réelle qui a déclenché la reconnaissance.
la source
J'ai remarqué que les gestes gauche / droite et haut / bas fonctionnent ensemble par paires, il vous suffit donc de spécifier deux outils de reconnaissance de gestes. Et les documents semblent être faux.
la source
Eh bien ça craint, j'ai résolu le problème en ajoutant 2 gestes comme Lars l'a mentionné et cela a parfaitement fonctionné ...
1) Gauche / Droite 2) Haut / Bas
la source
Voici maintenant la fonction didSwipe
la source
Si vous utilisez Xcode 4.2, vous pouvez ajouter des Gesture Recognizers @ le storyboard, puis lier les Gesture Recognizers GUI à IBActions.
Vous pouvez trouver les outils de reconnaissance de gestes dans la bibliothèque d'objets du volet Utilitaires (en bas du volet droit).
Ensuite, c'est juste une question de contrôle-glisser vers l'action appropriée.
la source
Si vous souhaitez qu'il détecte les quatre directions, vous devrez créer quatre instances, comme vous l'avez fait dans votre solution de contournement.
Voici pourquoi : La même instance de UISwipeGestureRecognizer que vous créez est l'instance qui est transmise au sélecteur en tant qu'expéditeur. Donc, si vous le définissez pour reconnaître les quatre directions, il retournera true pour
sgr.direction == xxx
où xxx est l'une des quatre directions.Voici une solution alternative qui implique moins de code (suppose l'utilisation d'ARC):
la source
Voici un exemple de code pour l'utilisation d'UISwipeGestureRecognizer. Notez les commentaires.
swipeRight et swipeLeft sont des méthodes que vous utilisez pour effectuer des activités spécifiques basées sur un balayage vers la gauche ou vers la droite. Par exemple:
la source
la source
Swift 2.1
J'ai dû utiliser ce qui suit
la source
hmm, étrange, ça marche parfaitement pour moi, je fais exactement la même chose
pense que tu devrais essayer de regarder
Méthode UIGestureRecognizerDelegate
dans les journaux, vous devez voir quelque chose comme:
devrait commencer le geste; target = <(action = actionForUpDownSwipeGestureRecognizer :, target =)>; direction = haut, bas, gauche, droite>
la source
utilisez ceci, cela devrait être l'opération de bit
la source
Cela me rendait fou. J'ai finalement trouvé un moyen fiable d'avoir plusieurs swipeGestureRecognizers.
Il semble qu'il y ait un bogue dans iOS si le nom de votre sélecteur "action" est le même sur plusieurs swipeGestureRecognizers. Si vous les nommez différemment, par exemple handleLeftSwipeFrom et handleRightSwipeFrom, tout fonctionne.
la source