131 votes

Définir l’orientation de UISwipeGestureRecognizer

Je veux ajouter un simple geste de balayage de la reconnaissance de mon point de vue sur iPhone projet. Les mouvements dans toutes les directions (droite, bas, gauche, haut) devrait être reconnue.

Il est indiqué dans les docs pour UISwipeGestureRecognizer:

Vous pouvez spécifier plusieurs directions par la spécification de plusieurs UISwipeGestureRecognizerDirection des constantes à l'aide de bits or opérandes. La direction par défaut est UISwipeGestureRecognizerDirectionright.

Cependant pour moi, il ne fonctionne pas. Lorsque tous les quatre directions sont OU ed seulement à gauche et à droite de glisse 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 fixé ce, avec l'ajout de quatre modules de reconnaissance à la vue, mais je suis curieux de savoir pourquoi n'a t il pas travailler comme annoncé dans les docs?

- (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.");
}

115voto

RupertP Points 1164

Semble qu'il y est un bug. Vous pouvez spécifier la direction autorisée(s) comme vous l'avez fait. Mais lorsque vous essayez d'accéder à l' effectif de la direction qui a déclenché le mouvement de balayage dans l'action sélecteur de la méthode que vous obtenez toujours le masque de bits défini à l'origine (pour le permis directions).

Cela signifie que les contrôles de la direction réelle sera toujours échouer lorsque plus de 1 sens. Vous pouvez voir par vous-même très facilement lors de la sortie de la valeur de "direction" dans le sélecteur de la méthode (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 en disant que le comportement des œuvres comme c'était prévu.

Ainsi, par exemple, dans un tableau d'affichage vous pouvez glisser à gauche ou à droite dans la vue de table de la cellule de déclenchement "supprimer" (ce qui aurait des directions de la geste de balayage ensemble à gauche et à droite)

Cela signifie que l'original de la solution de contournement est la façon dont il est censé être utilisé. La direction de la propriété ne peut être utilisée pour obtenir les gestes correctement reconnue, mais pas dans la méthode effectuée sur le succès de la reconnaissance de comparer par la direction réelle qui a déclenché la reconnaissance.

25voto

Lars Points 201

J’ai remarqué que gauche/droite et haut/bas gestes travaillent ensemble par paires, donc il suffit de spécifier deux modules de reconnaissance de geste. Et les docs ne semblent pas avoir tort.

22voto

yunas Points 2702

Bien que suce, j’ai résolu le problème en ajoutant 2 gestes comme Lars mentionné et qui a fonctionné parfaitement...

1) gauche/droite 2) haut/bas

13voto

KarenAnne Points 629
<pre><code></code><p>Maintenant, c’est la fonction de didSwipe</p><pre><code></code></pre></pre>

5voto

Grymm Points 51

Si votre à l’aide de Xcode 4.2 vous pouvez ajouter des modules de reconnaissance de geste @ le storyboard et puis lier la reconnaissance de geste de GUI de IBActions.

Vous pouvez trouver les modules de reconnaissance de geste dans la bibliothèque d’objets du volet Utility (le bas du volet droit).

Puis c’est juste une question de contrôle en faisant glisser à l’action appropriée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X