【问题标题】:2 various UIPanGestureRecognizers with different directions simultaneously?2个不同方向的UIPanGestureRecognizers?
【发布时间】:2015-05-14 13:51:00
【问题描述】:

可以上下左右平移。

识别器 1 仅处理垂直平移,识别器 2 仅处理水平平移。它们都与同一个委托对象链接。

识别器 2 完全独立于第一个(除了上述 4 个方向中只能选择一个方向)。

那么如何防止其中一个与另一个同时执行呢?

【问题讨论】:

  • 目前识别器 1 或 2 是哪种手势识别器?
  • 它们是 UISwipeGestureRecognizers 还是 UIPanGestureRecognizers? (你的标题和问题在这方面似乎有冲突。)
  • 平移手势识别器和另一个平移手势识别器。请仔细阅读问题。标有“P.S.”的部分只是加法。如果它让你感到困惑,你不需要阅读它
  • 在您的实际问题中没有提到 UIPanGestureRecognizer 仅供参考……仅在您的标题中。您只在实际问题中提到 UISwipeGestureRecognizer:“如果它对我有用,我会替换 UISwipeGesture ...”
  • 我已经删除了让你感到困惑的部分。现在UIPanGesture 只在问题中提及

标签: ios uigesturerecognizer gesture uipangesturerecognizer simultaneous


【解决方案1】:
-(void)initPanGestures{
UIPanGestureRecognizer *panGestureRecognizer1 = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                                action:@selector(handlePan1Gesture:)];

UIPanGestureRecognizer *panGestureRecognizer2 = [[UIPanGestureRecognizer alloc] initWithTarget:self
                                                                                        action:@selector(handlePan2Gesture:)]
}

-(void)handlePan1Gesture:(UIPanGestureRecognizer *)sender{
CGPoint velocity = [sender velocityInView:sender.view];

switch(sender.state) {

        case UIGestureRecognizerStateBegan:
        if(fabs(velocity.y) > fabs(velocity.x)){
            panGestureRecognizer2.enabled=YES;
            panGestureRecognizer1.enabled=NO;
        }
        break;
        case UIGestureRecognizerStateCancelled:
         panGestureRecognizer1.enabled=YES;
        break;
    case UIGestureRecognizerStateEnded:{
        panGestureRecognizer1.enabled=YES;
    }

        break;
}

if(velocity.x > 0)
{
    NSLog(@"gesture went right");
}
else if(velocity.x < 0)
{
    NSLog(@"gesture went left");
}


}

-(void)handlePan2Gesture:(UIPanGestureRecognizer *)sender{
 CGPoint velocity = [sender velocityInView:sender.view];
switch(sender.state) {

    case UIGestureRecognizerStateBegan:
        if(fabs( velocity.x) > fabs(velocity.y)){
            panGestureRecognizer2.enabled=NO;
            panGestureRecognizer1.enabled=YES;

        }
        break;

    case UIGestureRecognizerStateCancelled:
        panGestureRecognizer2.enabled=YES;
        break;
    case UIGestureRecognizerStateEnded:
         panGestureRecognizer2.enabled=YES;
        break;

}


if(velocity.y > 0)
{
    NSLog(@"gesture went down");
}
else if(velocity.y < 0)
{
    NSLog(@"gesture went up");
}

 }

另外,对于两个不同的手势,您必须实现委托方法并识别手势。例如,我同时使用了两个手势长和平移手势

#pragma mark - UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

return YES;
}

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([panGestureRecognizer1 isEqual:gestureRecognizer]) {

    return [panGestureRecognizer2 isEqual:otherGestureRecognizer];
}

if ([panGestureRecognizer2 isEqual:gestureRecognizer]) {

    return [panGestureRecognizer1 isEqual:otherGestureRecognizer];
}

return NO;
 }

【讨论】:

  • 不太对,因为它不会阻止手势同时执行。
  • 您的答案中的shouldRecognizeSimultaneouslyWithGestureRecognizer: 部分是与此特定问题相关的唯一部分...(即self.selectedItemIndexPath? 是什么)
  • 我认为handlePan是用来处理方向的,在上面的问题和同时处理多个手势应该RecognizeSimultaneouslyWithGestureRecognizer部分是der,上面的代码只是一个例子来理解。
  • 我明白你在说什么,但是(1)如果滑动是在对角线上,如果条件都满足,(2)如果 OP 实际上使用的是 UISwipeGestureRecognizer,机会是他/她正在这样设置方向:例如swipeGesture.direction = UISwipeGestureRecognizerDirectionUp|UISwipeGestureRecognizerDirectionDown;
  • 这个问题似乎已经解决了,但是:1)你忘记了以下内容:“识别器 1 只处理垂直平底锅,识别器 2 只处理水平平底锅。”请修复代码的第一部分 2)我不明白你想用shouldRecognizeSimultaneouslyWithGestureRecognizer: 做什么。这似乎是额外的,因为您根本无法执行一个手势。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
相关资源
最近更新 更多