20

Hai un problema relativo ai gesti. Ho implementato UISwipeGestureRecognizer per ottenere gli eventi swipe sinistro e destro e tutto funziona correttamente. Comunque il problema che sto affrontando è che gli UISlider che ho nella stessa vista non stanno giocando bene. Il movimento di scorrimento dei cursori viene scambiato come un colpo a sinistra/a destra.Problema gestuale: UISwipeGestureRecognizer + UISlider

Qualcuno ha riscontrato questo problema prima, ha qualche idea su come correggerlo?

Molte grazie.

ecco il codice contenuto all'interno del controller della 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 
     } 
    } 

risposta

55

Il modo più semplice per gestire questa situazione è probabilmente per evitare che il sistema di riconoscimento gesto di vedere tocchi sul vostro dispositivo di scorrimento. Puoi farlo impostando te stesso come il delegato, e quindi attuare

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

Se questo non funziona, è possibile che il dispositivo di scorrimento in realtà ha subviews che ricevono il tatto, così si potrebbe a piedi fino alla superview catena, i test ogni vista lungo la strada.

+0

Grandi risposte. Grazie! – MrDB

+0

Testato. Funziona. Dovevo solo farlo controllare per la classe UISlider. – MrDB

+0

Oops, ho detto switch. Vado a ripararlo. –

0

Ho finito per farlo funzionare poco prima che Kevin rispondesse sopra. Ecco il codice che ho usato, ma il look di Kevin è più pulito (non hai provato 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; 
}