18

Ho bisogno di rilevare la direzione del mio gesto di scorrimento e ho avuto problemi con esso. il gesto sta funzionando, ma non so come rilevare la direzione. ...come rilevare la direzione del gesto di scorrimento?

swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(detectSwipe:)]; 
[swipeGesture setNumberOfTouchesRequired:1]; 
[swipeGesture setDirection:UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp]; 
[appView addGestureRecognizer:swipeGesture]; 

-(void)detectSwipe:(UISwipeGestureRecognizer *)recognizer { 
switch (recognizer.direction) { 
    case UISwipeGestureRecognizerDirectionUp: 
     NSLog(@"smth1"); 
     break; 


    case UISwipeGestureRecognizerDirectionDown: 
     NSLog(@"smth2"); 
    default: 
     break; 
} 
} 

non funziona:/

+0

Si prega di definire Registra il valore errato? Non registra nulla? DetectSwipe non viene chiamato? – sosborn

+0

Viene chiamato il caso 'default' quando faccio scorrere verso l'alto o verso il basso. –

+0

Dato che è solo un enum: hai provato a trasmettere e registrare il valore del riconoscimento: http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UISwipeGestureRecognizer_Class/Reference/Reference.html – bryanmac

risposta

20

La struttura direction definisce solo il accettati indicazioni che sono riconosciuti come colpi, non la direzione effettiva di un particolare colpo.

Il modo più semplice sarebbe utilizzare due riconoscitori di gesti separati. È inoltre possibile controllare la posizione del tocco all'avvio del gesto e al termine con il metodo locationInView:. soluzione

+0

'CGPoint start = [posizione swipeGestureInView: appView];' uso questa funzione e questa funzione mi fornisce il punto di inizio dello scorrimento, ma come posso rilevare quando termina lo swipe? l'unico modo è usare 'touchesBegan' e' touchEnded'? –

+1

Non sono sicuro che sia effettivamente possibile (probabilmente stai meglio con due riconoscitori). Controlla lo 'stato' del riconoscitore di gesti nella tua azione. Per la maggior parte dei riconoscitori di gesti, transita da 'UIGestureRecognizerStateBegan' a' UIGestureRecognizerStateEnded', ma potrebbe essere che il tipo di riconoscimento del gesto di scorrimento non lo faccia, non l'ho provato. – omz

+1

risolto. io uso 'touchesBegan' e' touchEnded'. –

11

estensione di OMZ:

self.myView è la vista che voglio mettere il sistema di riconoscimento gesto. Il codice seguente non è testato, immagino sarebbe meglio mantenere i riconoscitori come property s e aggiungerli all'interno del file viewDidLoad() o xib. self è un UIViewController.

UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedLeft:)]; 
[swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft ]; 
[self.view addGestureRecognizer:swipeLeft]; 

UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipedRight:)]; 
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight ]; 
[self.view addGestureRecognizer:swipeRight]; 

Aggiungi questi due metodi per la vostra UIViewController e aggiungere le azioni necessarie:

- (IBAction)swipedRight:(UISwipeGestureRecognizer *)recognizer 
{ 
    NSLog(@"swiped right"); 
} 

- (IBAction)swipedLeft:(UISwipeGestureRecognizer *)recognizer 
{ 
    NSLog(@"swiped left"); 
} 
47

Ecco un esempio da uno dei miei progetti: "non funziona"

// ... 

    UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; 
    swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft; 
    [self.view addGestureRecognizer:swipeLeft]; 

    UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; 
    swipeRight.direction = UISwipeGestureRecognizerDirectionRight; 
    [self.view addGestureRecognizer:swipeRight]; 

    UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; 
    swipeUp.direction = UISwipeGestureRecognizerDirectionUp; 
    [self.view addGestureRecognizer:swipeUp]; 

    UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(didSwipe:)]; 
    swipeDown.direction = UISwipeGestureRecognizerDirectionDown; 
    [self.view addGestureRecognizer:swipeDown]; 

    // ... 

- (void)didSwipe:(UISwipeGestureRecognizer*)swipe{ 

    if (swipe.direction == UISwipeGestureRecognizerDirectionLeft) { 
     NSLog(@"Swipe Left"); 
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionRight) { 
     NSLog(@"Swipe Right"); 
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionUp) { 
     NSLog(@"Swipe Up"); 
    } else if (swipe.direction == UISwipeGestureRecognizerDirectionDown) { 
     NSLog(@"Swipe Down"); 
    } 
} 
+0

Sta funzionando per me la soluzione perfetta –

+0

Penso che non sia necessario aggiungere 4 riconoscitori di gesti, basta aggiungerne uno e nel metodo didSwipe controllare la direzione di scorrimento del mittente, che dovrebbe farlo –

Problemi correlati