同时使用 UILongPressGestureRecognizer 和 UISwipeGestureRecognizer [英] Using UILongPressGestureRecognizer and UISwipeGestureRecognizer simultaneously

查看:58
本文介绍了同时使用 UILongPressGestureRecognizer 和 UISwipeGestureRecognizer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用长按手势创建一个简单的视图(黑色方块)并将其拖到屏幕上(UIGestureRecognizerStateChanged),直到我捕捉到 UIGestureRecognizerStateEnded.好的,这很好用.现在我希望能够开始识别这个黑色方形视图的附加手势(UISwipeGestureRecognizer).算法很简单:

I create a simple view (black square) with long press gesture and drag it on the screen (UIGestureRecognizerStateChanged) until i catch UIGestureRecognizerStateEnded. OK, this works well. Now I want to be able to start recognizing additional gesture (UISwipeGestureRecognizer) for this black square view. The algorithm is simple:

  1. 长按创建黑色方块
  2. 手指停留在屏幕上
  3. 拖动方形视图 (setCenter:)
  4. 滑动并识别 UISwipeGestureRecognizer

问题是当长按手势未完成时我无法识别滑动 (UIGestureRecognizerStateEnded)

The problem is that I cant recognize swipe while the long press gesture is not finished (UIGestureRecognizerStateEnded)

#pragma mark - View lifecycle

- (void)loadView {
    [super loadView];

    // Long press
    self.longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
    [self.longPressGestureRecognizer setDelegate:self];
    [self.view addGestureRecognizer:self.longPressGestureRecognizer];

    // Swipe
    self.swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(gestureAction:)];
    [self.swipeGestureRecognizer setDelegate:self];
    [self.swipeGestureRecognizer setEnabled:NO];
    [self.view addGestureRecognizer:self.swipeGestureRecognizer];
}

#pragma mark - Gesture recognizer

- (void)gestureAction:(UIGestureRecognizer *)recognizer {

    // Swipe
    if ([recognizer isKindOfClass:NSClassFromString(@"UISwipeGestureRecognizer")]) {
        NSLog(@"swipeGestureRecognizer handled!!");
    }

    // Long press
    if ([recognizer isKindOfClass:NSClassFromString(@"UILongPressGestureRecognizer")]) {
        if (recognizer.state == UIGestureRecognizerStateBegan) {
            self.activeView = [[ItemView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
            [self.activeView setBackgroundColor:[UIColor blackColor]];
            self.activeView.center = [recognizer locationInView:self.view];
            [self.view addSubview:self.activeView];
        }
        else if (recognizer.state == UIGestureRecognizerStateChanged) {
            if (![self.swipeGestureRecognizer isEnabled]) {
                [self.swipeGestureRecognizer setEnabled:YES];
                NSLog(@"swipeGestureRecognizer enabled");
            }
            self.activeView.center = [recognizer locationInView:self.view];
        }
        else if (recognizer.state == UIGestureRecognizerStateEnded) {
            [self.swipeGestureRecognizer setEnabled:NO];
            NSLog(@"swipeGestureRecognizer disabled");
            [self.activeView removeFromSuperview];
            self.activeView = nil;
        }
    }
}

#pragma mark - UIGestureRecognizerDelegate

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    return YES;
}

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    return YES;
}

<小时>

附言当您长按在日画布上创建事件时,我希望行为与本机日历应用程序完全相同.如果你滑动一个对象(在你结束长按手势之前)它会平滑地消失.


P.S. I want the behavior exactly as in native Calendar app when you are creating an event on the day canvas with long press. If you swipe an object (before you end long press gesture) it smoothly disappears.

推荐答案

要同时识别多个手势,需要使用 UiGestureRecognizer Protocol 中的以下委托方法,

For multiple gestures to recognized simultaneosly, you need to use the following delegate method from UiGestureRecognizer Protocol,

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;

这是链接 到文档.

编辑

所以我尝试做同样的事情,是的,即使在我的情况下,在长按结束之前也无法识别滑动..!所以如果你想移动视图,然后使用 PanGesture 而不是滑动手势..!我刚试过它会起作用..:)

So I tried doing the same thing and, Yes even in my case the swipe was not recognized until long press is over..! So fi you want to move the view around, THen use PanGesture instead of swipe gesture..! It will work I just tried..:)

这篇关于同时使用 UILongPressGestureRecognizer 和 UISwipeGestureRecognizer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆