2012-03-13 7 views
6

Estoy usando la clase UILongPressGestureRecognizer para manejar si se está seleccionando un elemento.UILongPressGestureReconocimiento detener el controlador sin dejar de tocar

La lógica es la siguiente: el usuario presiona durante 1 segundo un elemento (subclase UIView). Una vez que se detecta el gesto, el elemento se resalta y se puede mover.

El usuario debe mover este elemento por la pantalla sin dejar de tocarlo.

El problema al que me enfrento es el gesto reconocido sombras toques Bean/Move/Ended necesario para la clase de elemento para organizar el movimiento.

He intentado eliminar el gesto reconocido una vez que se ha detectado y el elemento seleccionado. Pero sigue enviando mensajes al control del gesto en lugar de a los métodos de toque de llamada.

¿Alguien sabe alguna forma de dejar de "escuchar" el reconocedor de gestos sin dejar el dedo de la pantalla?

Gracias.

Aquí el código:

-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [self removeGestureRecognizer:[self.gestureRecognizers objectAtIndex:0]]; 

     NSLog(@"Long press detected."); 
    } 
} 

Como se puede ver en la rama de lo contrario el delegado llama permite que todos los procedimientos para marcar este elemento como seleccionado, y justo después de retirar los reconocedores.

¿Qué me falta?

--EDIT--

¡Hecho! Esto funciona:

#pragma mark Gesture Functions 
-(void)addGestures 
{ 
    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] 
               initWithTarget:self 
               action:@selector(handleLongPress:)]; 
    longPress.minimumPressDuration = iItemLongPressTime; 
    [self addGestureRecognizer:longPress]; 
    [longPress release]; 
} 
- (void)handleLongPress:(UILongPressGestureRecognizer*)sender { 
    if (sender.state == UIGestureRecognizerStateEnded) { 

     NSLog(@"Long press Ended"); 
    } 
    else { 
     NSLog(@"Long press detected."); 

     if (self.isSelected) return; 

     if ([delegate respondsToSelector:@selector(singleTouch:)]) 
      [delegate singleTouch:self]; 

     [sender removeTarget:self action:@selector(handleLongPress:)]; 
     sender.enabled = NO; 
     [self removeGestureRecognizer:sender]; 



    } 
} 

¡Recuerdos!

Respuesta

1

Hay dos soluciones en mi mente.

  1. Para animar UIView, por favor escribió una nueva clase que se hereda de la clase UIView e implementar los delegados táctiles en lugar de escribir las Gustures para manejar la animación (si los delegados táctiles no activan en la clase actual).

2.He eliminado correctamente el UILongPressGestureRecognizer después de haberlo activado una vez.

Consulte el código de abajo me .Pregunte si tiene alguna duda

pasos que he hecho

He añadido un UIView como "myView" a mi principal con vista al principal con vista cargas .

He dado la etiqueta a la myView (puede dar 1,2,3 ... etc.) para diferenciar la vista aprovechada de las subvistas de la vista principal.

Asignado el gesto UILongPressGestureRecognizer a myView y asignado como método "moveMe".

Cuando el usuario presiona el myView largo, se activará el método "moveMe".

Entonces itera los subvistas MAINVIEW con la condición == 1 Tag

He quitado la UILongPressGestureRecognizer de los subview.As podemos saber que la etiqueta 1 principal con vista al subvista es myView.

Así que el NSLog (@ "gesto eliminado"); y NSLog (@ "moveMe"); iniciará sesión en la consola solo de una vez.

The NSLog (@ "touchesBegan"); se activará primero en lugar de activar el método "moveMe".

Luego NSLog (@ "touchesBegan"); se activará siempre después de eliminar el gesto. El método "moveMe" no se activará nunca.

Código

- (void)viewDidLoad {  
     //Adding to UIView to main view when application is loading. 
     UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 80, 80)];   
     myView.backgroundColor = [UIColor viewFlipsideBackgroundColor]; 
      myView.tag = 1; //adding a tag to identify it. 
     //Adding Long Press Gesture to the UIView. 
     UILongPressGestureRecognizer *myGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(moveMe:)]; 
     [myView addGestureRecognizer:myGesture]; 
     [myGesture release]; 
     myGesture = nil; 
     [self.view addSubview:myView]; 
     [myView release]; 
     myView = nil;  
     [super viewDidLoad]; 
    }  

    //Method to trigger when user pressed long on the added UIView. 

-(void)moveMe:(id)sender 
{ 
     for (UIView *subViews in [self.view subviews]) 
     { 
      if (subViews.tag == 1) { 
       [subViews removeGestureRecognizer:sender]; 
       NSLog(@"gesture removed"); 
      }  
     }  
     NSLog(@"moveMe"); 
    }  
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"touchesBegan"); 
} 

o remítase Disable gesture recognizer iOS

+0

intente describir su pregunta en detalle –

+0

He intentado enviar para eliminar el método del remitente como parámetro pero aún no funciona. – NemeSys

+0

He editado mi respuesta ... –

4

¿La clase UIView costumbre tiene su propio código de control de tacto? Si no, una solución simple es establecer la propiedad allowableMovement del UILongPressGestureRecognizer en CGFLOAT_MAX, o un número grande, y usar las devoluciones de llamada de actualización de gestos para arrastrar su vista personalizada. Puede obtener el desplazamiento utilizando el método - (CGPoint)locationInView:(UIView *)view en la supervista y comparar su posición con el inicio del reconocedor.

+1

+1 Esta es la solución más simple. Esencialmente, 'Si usa un reconocedor de gestos, utilice un reconocedor de gestos'. – NJones

+1

No es necesario cambiar la propiedad 'allowableMovement'; Solo se usa para probar la falla. De los comentarios en 'UILongPressGestureRecognizer.h'" 'Movimiento máximo en píxeles permitido antes de que el gesto falle. Una vez reconocido (después de minimumPressDuration) no hay límite en el movimiento de los dedos para el resto del seguimiento táctil'' – NJones

+0

Hola, gracias por las respuestas . La subclase UIView implementa touchesBegan/Moved/Ended para manipular tamaño y ubicación en su superview. El uso de gestos proviene de la necesidad de hacer menos sensible a los toques de cada elemento. En este momento estoy usando la solución de desactivar el objeto reconocedor de gestos y funciona como un amuleto. – NemeSys

Cuestiones relacionadas