18

Muszę wykryć kierunek mojego machnięcia palcem i mam z tym problem. gest działa, ale nie wiem, jak wykryć kierunek. ...jak wykrywać kierunek ruchu machnięcia?

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; 
} 
} 

to nie działa:/

+0

proszę określić Czy dziennik jest nieprawidłowy? Czy nic nie rejestruje? Czy funkcja wykrywania nie jest wywoływana? – sosborn

+0

'Domyślnie' przypadek jest wywoływany podczas przesuwania palcem w górę lub w dół. –

+0

Ponieważ jest to tylko element wyliczeniowy - czy próbowałeś rzutować i rejestrować wartość rozpoznawania: http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UISwipeGestureRecognizer_Class/Reference/Reference.html – bryanmac

Odpowiedz

20

Obiekt direction definiuje tylko dozwolone kierunki, które są uznane za kiepskie piwo, a nie kierunek danego machnięcia rzeczywisty.

Najprościej byłoby użyć dwóch oddzielnych urządzeń do rozpoznawania gestów. Można również sprawdzić lokalizację dotyku, gdy gest się rozpocznie, a kiedy kończy się metodą locationInView:. Rozwiązanie

+0

'CGPoint start = [swipeGesture locationInView: appView];' Używam tego i ta funkcja daje mi punkt początkowy przesunięcia, ale jak mogę wykryć kiedy przesunięcie jest zakończone? jedynym sposobem jest użycie 'touchesBegan' i' touchesEnded'? –

+1

Nie jestem pewien, czy jest to rzeczywiście możliwe (prawdopodobnie lepiej, jeśli masz dwa czytniki). Sprawdź "stan" urządzenia rozpoznającego gesty w swoim działaniu. W przypadku większości programów do rozpoznawania gestów przejście z "UIGestureRecognizerStateBegan" na "UIGestureRecognizerStateEnded", ale może się zdarzyć, że typ kreatora gestów dotykowych tego nie robi, nie próbowałem go. – omz

+1

rozwiązany. Używam 'touchesBegan' i' touchesEnded'. –

11

rozciągających OMZ za:

self.myView jest widok chcę umieścić aparat rozpoznawania gest. Poniższy kod nie został przetestowany. Sądzę, że lepiej byłoby przechowywać identyfikatory jako property s i dodać je do pliku viewDidLoad() lub xib. self to 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]; 

Dodaj te dwie metody do UIViewController i dodać niezbędne działania:

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

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

Oto przykład jednego z moich projektów: "to nie działa"

// ... 

    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

To działa dla mnie idealne rozwiązanie –

+0

Myślę, że nie musisz dodawać 4 rozpoznawania gestów, po prostu dodaj jeden iw metodzie didSwipe sprawdź kierunek przesuwania nadawcy, który powinien to zrobić –

Powiązane problemy