【问题标题】:how detect swipe gesture direction?如何检测滑动手势方向?
【发布时间】:2012-01-11 01:28:55
【问题描述】:

我需要检测我的滑动手势的方向,但我遇到了问题。手势有效,但我不知道如何检测方向。 ...

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

它不工作:/

【问题讨论】:

标签: ios objective-c swipe gesture-recognition uiswipegesturerecognizer


【解决方案1】:

这是我的一个项目的示例:

    // ...

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

【讨论】:

  • 我认为你不需要添加4个手势识别器,只需添加一个并在didSwipe方法中检查发送者的滑动方向,应该可以做到
【解决方案2】:

direction 属性仅定义被识别为滑动的允许方向,而不是特定滑动的实际方向。

最简单的方法是使用两个单独的手势识别器。您还可以使用locationInView: 方法检查手势开始和结束时的触摸位置。

【讨论】:

  • CGPoint start = [swipeGesture locationInView:appView]; 我使用这个,这个函数给了我滑动的起点,但是我如何检测滑动结束的时间?唯一的方法是使用touchesBegantouchesEnded?
  • 我不确定这是否真的可行(你最好使用两个识别器)。在您的操作中检查手势识别器的state。对于大多数手势识别器,它是从UIGestureRecognizerStateBegan 过渡到UIGestureRecognizerStateEnded,但可能是滑动手势识别器类型不这样做,我没有尝试过。
【解决方案3】:

扩展omz的解决方案:

self.myView 是我想要放置手势识别器的视图。下面的代码未经测试,我想最好将识别器保留为propertys 并将它们添加到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");
} 

【讨论】:

    【解决方案4】:

    使用 Swift 5 进行滑动手势方向检测

        override func viewDidLoad() {
        super.viewDidLoad()
    
             let leftSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))
             let rightSwipe = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipes(_:)))
    
             leftSwipe.direction = .left
             rightSwipe.direction = .right
    
             view.addGestureRecognizer(leftSwipe)
             view.addGestureRecognizer(rightSwipe)
        }
    
        @objc func handleSwipes(_ sender:UISwipeGestureRecognizer) {
    
            if (sender.direction == .left) {
                    print("Swipe Left")
            }
    
            if (sender.direction == .right) {
                print("Swipe Right")
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 2011-07-23
      • 2020-01-17
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 2020-09-05
      相关资源
      最近更新 更多