Je détecte si l'utilisateur a appuyé pendant 2 secondes:
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 2.0;
[self addGestureRecognizer:longPress];
[longPress release];
Voici comment je gère le long appui:
-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
NSLog(@"double oo");
}
Le texte "double oo" est imprimé deux fois lorsque j'appuie sur cette touche pendant plus de 2 secondes. Pourquoi est-ce? Comment puis-je réparer?
UILongPressGestureRecognizer est un outil de reconnaissance d'événements en continu. Vous devez regarder l'état pour voir si c'est le début, le milieu ou la fin de l'événement et agir en conséquence. c’est-à-dire que vous pouvez jeter tous les événements après le début ou ne regarder que les mouvements dont vous avez besoin. De la référence de classe :
Les longs gestes sont continus. Le geste commence (UIGestureRecognizerStateBegan) lorsque le nombre de doigts autorisés (numberOfTouchesRequired) a été pressé pendant la période spécifiée (minimumPressDuration) et que les touches ne dépassent pas la plage de mouvement autorisée (allowableMovement). La reconnaissance des gestes passe à l'état Changer à chaque fois qu'un doigt se déplace et se termine (UIGestureRecognizerStateEnded) lorsqu'un des doigts est levé.
Maintenant, vous pouvez suivre l'état comme ça
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"UIGestureRecognizerStateEnded");
//Do Whatever You want on End of Gesture
}
else if (sender.state == UIGestureRecognizerStateBegan){
NSLog(@"UIGestureRecognizerStateBegan.");
//Do Whatever You want on Began of Gesture
}
}
Pour vérifier l'état de UILongPressGestureRecognizer, ajoutez simplement une instruction if sur la méthode selector:
- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"Long press Ended");
} else if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"Long press detected.");
}
}
Vous devez vérifier le bon état, car il existe différents comportements pour chaque état. Très probablement, vous aurez besoin de l'état UIGestureRecognizerStateBegan
avec le UILongPressGestureRecognizer
.
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];
...
- (void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
if(UIGestureRecognizerStateBegan == gesture.state) {
// Called on start of gesture, do work here
}
if(UIGestureRecognizerStateChanged == gesture.state) {
// Do repeated work here (repeats continuously) while finger is down
}
if(UIGestureRecognizerStateEnded == gesture.state) {
// Do end work here when finger is lifted
}
}
Objective-C
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"Long press Ended");
} else if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"Long press detected.");
}
}
Swift 2.2:
func handleLongPress(sender:UILongPressGestureRecognizer) {
if (sender.state == UIGestureRecognizerState.Ended) {
print("Long press Ended");
} else if (sender.state == UIGestureRecognizerState.Began) {
print("Long press detected.");
}
}
Voici comment gérer cela dans Swift:
func longPress(sender:UILongPressGestureRecognizer!) {
if (sender.state == UIGestureRecognizerState.Ended) {
println("Long press Ended");
} else if (sender.state == UIGestureRecognizerState.Began) {
println("Long press detected.");
}
}
Swift 3.0:
func handleLongPress(sender: UILongPressGestureRecognizer) {
if sender.state == .ended {
print("Long press Ended")
} else if sender.state == .began {
print("Long press detected")
}
votre gestionnaire de geste reçoit un appel pour chaque état de geste. vous devez donc mettre un chèque pour chaque état et mettre votre code dans l'état requis.
Il faut préférer utiliser switch-case plutôt que if-else:
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 1.0;
[myView addGestureRecognizer:longPress];
[longPress release];
-(void)handleLongPress:(UILongPressGestureRecognizer *)gesture {
switch(gesture.state){
case UIGestureRecognizerStateBegan:
NSLog(@"State Began");
break;
case UIGestureRecognizerStateChanged:
NSLog(@"State changed");
break;
case UIGestureRecognizerStateEnded:
NSLog(@"State End");
break;
default:
break;
}
}