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 的结束?