20

Obtuvo un problema relacionado con el gesto. Implementé UISwipeGestureRecognizer para deslizar los eventos hacia la izquierda y hacia la derecha y eso funciona bien. Sin embargo, el problema que estoy enfrentando es que los UISlider's que tengo en la misma vista no están jugando bien. El movimiento deslizante de los controles deslizantes se está confundiendo con un deslizamiento hacia la izquierda/derecha.Problema de gestos: UISwipeGestureRecognizer + UISlider

Cualquiera experimentó este problema antes, ¿tiene alguna idea de cómo corregirlo?

Muchas gracias.

Este es el código contenido en el controlador de vista:

- (void)viewDidLoad { 

      [super viewDidLoad]; 

       //Setup handling of LEFT and RIGHT swipes 
      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:(UISwipeGestureRecognizerDirectionLeft)]; 
       [[self view] addGestureRecognizer:recognizer]; 
       [recognizer release]; 
     } 

    -(void)handleSwipeFrom:(UISwipeGestureRecognizer *)recognizer { 

     if (recognizer.direction == UISwipeGestureRecognizerDirectionRight) { 
     NSLog(@"Swipe Right"); 
     //Do stuff 
     } 

     if (recognizer.direction == UISwipeGestureRecognizerDirectionLeft) { 
     NSLog(@"Swipe Left"); 
     //Do stuff 
     } 
    } 

Respuesta

55

La forma más sencilla de manejar esto es probablemente para evitar que el reconocedor gesto de ver toques en su deslizador. Puede hacerlo mediante el establecimiento de sí mismo como el delegado, y luego implementar

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    if ([touch.view isKindOfClass:[UISlider class]]) { 
     // prevent recognizing touches on the slider 
     return NO; 
    } 
    return YES; 
} 

Si esto no funciona, es posible que el control deslizante en realidad tiene subvistas que reciben al tacto, por lo que podría subir la superview cadena, las pruebas cada vista en el camino.

+0

Great answers. ¡Gracias! – MrDB

+0

Probado esto. Funciona. Solo tenía que hacer que verificara la clase UISlider en su lugar. – MrDB

+0

Vaya, dije el cambio. Iré a arreglar eso. –

0

Terminé haciendo que esto funcionara justo antes de que Kevin respondiera anteriormente. Aquí está el código que utilicé, pero el aspecto de Kevin es más limpio (no he probado el de Kevin):

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { 
    BOOL AllowSwipes = YES; 

     CGPoint point1 = [touch locationInView:_sliderLeft]; 
     CGPoint point2 = [touch locationInView:_sliderRight]; 

     //Left slider test 
     if ([_sliderLeft hitTest:point1 withEvent:nil] != nil) { 
      AllowSwipes = NO; 
      NSLog(@"On Left Slider"); 
     } 

     //Right slider test 
     if ([_sliderRight hitTest:point2 withEvent:nil] != nil) { 
      AllowSwipes = NO; 
      NSLog(@"On Right Slider"); 
     } 
    } 
    return AllowSwipes; 
}