18

我需要檢測我的滑動手勢的方向,我有問題。手勢正在工作,但我不知道如何檢測方向。 ...如何檢測滑動手勢的方向?

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

它不工作:/

+0

請定義記錄的值不正確嗎?它不記錄任何東西嗎? detectSwipe沒有被調用? – sosborn 2012-01-11 01:34:00

+0

當我向上或向下滑動時,會調用'default'情況。 – 2012-01-11 01:36:45

+0

由於它只是一個枚舉 - 你是否嘗試過投射和記錄識別器的值:http://developer.apple.com/library/IOs/#documentation/UIKit/Reference/UISwipeGestureRecognizer_Class/Reference/Reference.html – bryanmac 2012-01-11 01:46:09

回答

20

direction屬性只定義了允許被認定爲揮筆方向,而不是特定的刷卡的實際方向。

最簡單的方法是使用兩個單獨的手勢識別器。您也可以在手勢開始時以及以locationInView:方法結束時檢查觸摸的位置。

+0

'CGPoint start = [swipeGesture locationInView:appView];'我用這個和這個函數給我起點的刷卡,但是我怎麼檢測刷卡什麼時候結束?唯一的方法是使用'touchesBegan'和'touchesEnded'? – 2012-01-11 07:32:54

+1

我不確定這是否真的可行(你可能用兩個識別器更好)。檢查動作中手勢識別器的「狀態」。對於大多數手勢識別器,它從「UIGestureRecognizerStateBegan」過渡到「UIGestureRecognizerStateEnded」,但可能是滑動手勢識別器類型沒有這樣做,我沒有嘗試過。 – omz 2012-01-11 07:38:31

+1

解決了。我使用'touchesBegan'和'touchesEnded'。 – 2012-01-11 16:28:02

11

OMZ擴展的解決方案:

self.myView是我希望把手勢識別的看法。下面的代碼沒有經過測試,我想最好將識別器保存爲property s,並將它們添加到viewDidLoad()xib文件中。 selfUIViewController

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

這兩種方法添加到您的UIViewController並添加必要的行動:

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

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

這裏是我的一個項目爲例:「它不工作」

// ... 

    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

它爲我工作完美的解決方案 – 2017-12-14 15:43:30

+0

我認爲你不需要添加4手勢識別器,只需添加一個,並在didSwipe方法檢查發件人的滑動方向,應該這樣做 – 2018-01-16 14:33:36