iphone - UILongPressGestureRecognizer recibe dos llamadas cuando se presiona hacia abajo
tap gesture recognizer swift 4 (7)
Detecto si el usuario ha presionado durante 2 segundos:
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPress:)];
longPress.minimumPressDuration = 2.0;
[self addGestureRecognizer:longPress];
[longPress release];
Así es como manejo la pulsación larga:
-(void)handleLongPress:(UILongPressGestureRecognizer*)recognizer{
NSLog(@"double oo");
}
El texto "doble oo" se imprime dos veces cuando presiono durante más de 2 segundos. ¿Por qué es esto? ¿Cómo puedo arreglarlo?
Solo prueba esto:
C objetivo
- (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.");
}
}
Aquí está cómo manejarlo en Swift:
func longPress(sender:UILongPressGestureRecognizer!) {
if (sender.state == UIGestureRecognizerState.Ended) {
println("Long press Ended");
} else if (sender.state == UIGestureRecognizerState.Began) {
println("Long press detected.");
}
}
Debe verificar el estado correcto, ya que hay diferentes comportamientos para cada estado. Lo más probable es que necesites el estado UIGestureRecognizerStateBegan
con 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
}
}
Para verificar el estado del UILongPressGestureRecognizer, simplemente agregue una sentencia if en el método selector:
- (void)handleLongPress:(UILongPressGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded) {
NSLog(@"Long press Ended");
} else if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"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")
}
UILongPressGestureRecognizer es un reconocedor continuo de eventos. Debe mirar el estado para ver si esto es el inicio, la mitad o el final del evento y actuar en consecuencia. es decir, puede desechar todos los eventos después del inicio, o solo mirar el movimiento que necesite. De la referencia de clase :
Los gestos de larga pulsación son continuos. El gesto comienza (UIGestureRecognizerStateBegan) cuando se presiona el número de dedos permitidos (numberOfTouchesRequired) durante el período especificado (minimumPressDuration) y los toques no se mueven más allá del rango de movimiento permitido (permisible). El reconocedor de gestos pasa al estado de cambio cada vez que se mueve un dedo y finaliza (UIGestureRecognizerStateEnded) cuando se levanta cualquiera de los dedos.
Ahora puedes seguir el estado de esta manera
- (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
}
}
su gestor de gestos recibe una llamada para cada estado de gesto. por lo que necesita poner un cheque para cada estado y poner su código en el estado requerido.
Uno debe preferir usar switch-case over 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;
}
}