UIPanGesture 正在工作,但 UITapGesture 在 UIView 上不起作用

Posted

技术标签:

【中文标题】UIPanGesture 正在工作,但 UITapGesture 在 UIView 上不起作用【英文标题】:UIPanGesture is Working but UITapGesture Is not Working on UIView 【发布时间】:2016-12-15 21:14:30 【问题描述】:

我有一个小视图,我想在屏幕上移动并可以点击。所以我添加了一个 UIPanGestureRecognizer 来移动它,并添加一个 UITapGestureRecognizer 来接收这样的点击事件:

        let panner = UIPanGestureRecognizer(target: self, action: #selector(panDidFire(panner:)))
        playerViewController.view.addGestureRecognizer(panner)

        let tapper = UITapGestureRecognizer(target: self, action: #selector(viewTapped(tapper:)))
        playerViewController.view.addGestureRecognizer(tapper)

我在同一个文件中创建动作

    func viewTapped(tapper: UITapGestureRecognizer)
         fadeInButtons()
    
    func panDidFire(panner: UIPanGestureRecognizer) 
        let offset = panner.translation(in: view)
        panner.setTranslation(CGPoint.zero, in: view)
        var center = playerViewController.view.center
        center.x += offset.x
        center.y += offset.y
        playerViewController.view.center = center
    

当用户平移时调用 panDidFire() 函数,但根本不调用 viewTapped() 函数。

这有什么诀窍吗?我究竟做错了什么?还有另一种解决方法吗?

我正在使用 Xcode 8 和 swift 3

【问题讨论】:

手势是否相互冲突?致电panner. requireGestureRecognizerToFail(tapper) 以确保敲击者首先获得手势。 大部分看起来不错,但为什么你把你的手势(通过“let”)命名为和你的方法一样?另外,请发布方法代码 - 它可以帮助我们调试。 panner.requireGestureRecognizerToFail(tapper) 似乎没有做任何事情。我将尝试更改方法名称,并编辑帖子以包含方法代码。 【参考方案1】:

您必须设置识别器才能与视图上的其他手势识别器一起使用。请使用 UIGestureRecognizerDelegate 方法

gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool

   return true

【讨论】:

以上是关于UIPanGesture 正在工作,但 UITapGesture 在 UIView 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIPanGesture 拖动 tableView/scrollView

使用 UIPanGesture 时发送到实例的无法识别的选择器

让 UIPanGesture 和 UISwipeGesture 朝着同一个方向一起工作

将 UIView 拖放到另一个(UIPanGesture 识别器)中

UipanGesture 不适用于 Uiswitch

SpriteKit 中的 UIPanGesture