UISwipeGestureRecognizer 只有一个方向工作

Posted

技术标签:

【中文标题】UISwipeGestureRecognizer 只有一个方向工作【英文标题】:UISwipeGestureRecognizer only one direction working 【发布时间】:2014-06-16 17:34:52 【问题描述】:

所以我用 pageControl 制作了一个页面(这是一个有多个视图的页面,其中的点表示您所在的页面),我的代码在viewDidLoad 中如下所示:

UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)];
UIView *temp = [[UIView alloc]initWithFrame:self.view.frame];
temp.backgroundColor = [UIColor clearColor];
[temp addGestureRecognizer:swipe];
[self.view addSubview:temp];

在 swipeAction 选择器中我有:

- (void)swipeAction: (UISwipeGestureRecognizer *)sender
    NSLog(@"Swipe action called");
    if (sender.direction == UISwipeGestureRecognizerDirectionLeft) 
        //Do Something
    
    else if (sender.direction == UISwipeGestureRecognizerDirectionRight)
        //Do Something Else
    

令我惊讶的是,此方法仅在您向右滑动时才有效(即调用 else if 块)。当您向左滑动时,swipeAction 甚至不会被调用!这很奇怪,为什么会发生这种情况,我应该如何更改我的代码?任何答复表示赞赏。非常感谢!

【问题讨论】:

带有此识别器的视图是否位于导航控制器中? @SimonGoldeen 不,它只是一个普通的UIView 【参考方案1】:

这里有几件事您应该注意。首先,您必须为要观察的每个方向创建一个手势。不过这没什么大不了的,因为您可以简单地给它们相同的选择器,这就像一个手势指向两个方向。

UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)];
leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft;

UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeAction:)];
rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;


UIView *temp = [[UIView alloc]initWithFrame:self.view.frame];

temp.backgroundColor = [UIColor clearColor];
[temp addGestureRecognizer:leftSwipe];
[temp addGestureRecognizer:rightSwipe];

[self.view addSubview:temp];

其次,您从未指定手势的方向,使其默认为右(或方向枚举上的 1)

来自documentation:

默认方向是 UISwipeGestureRecognizerDirectionRight。有关详细信息,请参阅 UISwipeGestureRecognizerDirection 常量的说明。

typedef enum 
   UISwipeGestureRecognizerDirectionRight = 1 << 0,
   UISwipeGestureRecognizerDirectionLeft  = 1 << 1,
   UISwipeGestureRecognizerDirectionUp    = 1 << 2,
   UISwipeGestureRecognizerDirectionDown  = 1 << 3
 UISwipeGestureRecognizerDirection;

【讨论】:

如果您使用相同的选择器操作,则不需要两个识别器。您可以将它们组合在一起,一个识别器将检测两个方向。如果您想对左右滑动做出不同的响应,则需要两个识别器。 我只是在回答之前尝试过这个......它有效。我认为其他帖子指的是回调,它不会报告您操作中的方向.. swipe.direction 仍将设置为左|右,但它会在两个方向上正确触发操作。 @joeld 我可能应该稍微改一下。但是你能用一个手势确定滑动的方向吗? 感谢@0x7fffffff,它完美运行!起初我也使用了 2 个滑动手势识别器,我猜它不起作用,因为我还有 2 个不同的选择器对应于这些识别器。然后在我发布这个问题之前,我做了一些研究,我看到有人说你只能为每种类型的手势设置一个手势识别器,所以我只是把所有东西都结合起来了:P【参考方案2】:

斯威夫特 4

let swiper = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeFunction(sender:)))
swiper.direction = UISwipeGestureRecognizer.Direction.right
let swipel = UISwipeGestureRecognizer(target: self, action: #selector(self.swipeFunction(sender:)))
swipel.direction = UISwipeGestureRecognizer.Direction.left
UIView().addGestureRecognizer(swiper)
UIView().addGestureRecognizer(swipel)

@objc func swipeFunction(sender: UISwipeGestureRecognizer) 
    print(sender)

你应该能够从那里弄清楚,你为 UIView 的每个方向添加一个 UISwipeGestureRecognizer

【讨论】:

【参考方案3】:

swipe.direction 设置您正在识别的方向,它不会告诉您滑动的方向。创建识别器时添加此行:

swipe.direction = UISwipeGestureRecognizerDirectionLeft|UISwipeGestureRecognizerDirectionRight;

如果您需要检测滑动的方向,只需使用两个不同的识别器,一个用于左侧,一个用于右侧。

【讨论】:

感谢@joeld 的回复,您绝对是正确的,它没有告诉您滑动的方向,但是使用您的代码,它现在将每次滑动的方向识别为左,所以我猜唯一正确的方式仍然是有两个滑动手势识别器,每个检测一个不同的方向:D

以上是关于UISwipeGestureRecognizer 只有一个方向工作的主要内容,如果未能解决你的问题,请参考以下文章

识别用户剪切/滑动手势 (UISwipeGestureRecognizer)

UISwipeGestureRecognizer 滑动长度

UISwipeGestureRecognizer 只有一个方向工作

如何检测 UISwipeGestureRecognizer 的结束?

如何使 UISwipeGestureRecognizer 在 UIScrollView 中工作

UISwipeGestureRecognizer 没有触发