GestureRecognizer没有响应tap

Did*_*dia 51 uigesturerecognizer ios swift

UIImageView我的子类初始化后,我有以下代码行:

self.userInteractionEnabled = true
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
Run Code Online (Sandbox Code Playgroud)

我创建了必要的相关功能:

func handleTap(gestureRecognizer: UITapGestureRecognizer) {
    print("In handler")
}
Run Code Online (Sandbox Code Playgroud)

在点击有问题的视图时,"处理程序从未打印到控制台".然后我删除了处理函数,看看编译器是否会抱怨丢失的函数.它没有.

我很难过.我真的很感激任何光明人都可以放弃这一点.

更新:我的课实际上是一个UIImageView相反的UIView

Sco*_*ter 120

我正在使用UITapGestureRecognizer我放置在UILabel使用故事板上.

为了实现这一点,我还必须UILabel在故事板的Attributes Inspector中标记为"User Interaction Enabled"的块中放置一个复选标记.

在此输入图像描述

  • 是的,就是这样 - 自从我上次构建应用程序以来,已经忘记了这一点.看起来像是在附加手势识别器时应该自动化的东西. (5认同)
  • 我不明白为什么默认情况下禁用用户交互。 (3认同)
  • 你刚刚节省了我的 30 分钟。 (2认同)

Did*_*dia 15

在仔细梳理我的代码后,我发现了答案.

其中一个父视图是在没有提供的情况下创建的 frame:

虽然这是一个非常愚蠢的错误,可以保证删除这些问题,但是其他人在将来也会遇到同样的问题......

  • 类似于无框架问题,我只是有一个UITapGestureRecognizer无法工作,因为视图的框架高度对于内容来说太小(即使所有内容都很好地出现在了显示屏中)。可能是一个极端的案例,但添加此注释以防他人有所帮助。 (2认同)

Sur*_*raj 14

试试这个

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    self.view.userInteractionEnabled = true
    var tapGesture = UITapGestureRecognizer(target: self, action: Selector("handleTap:"))
    self.view.addGestureRecognizer(tapGesture)
}

func handleTap(sender : UIView) {
    println("Tap Gesture recognized")
}
Run Code Online (Sandbox Code Playgroud)

  • 将其放置在viewDidAppear中不是很好,因为您最终将添加大量手势 (3认同)

bra*_*tky 9

除了其他答案之外,这可以通过将手势识别器添加到多个视图来引起.手势识别器仅适用于单一视图.

参考:https://stackoverflow.com/a/5567684/6543020

  • 很棒的补充! (2认同)

mat*_*dek 9

我在程序化视图中遇到了这个问题。

我的带有手势识别器的 UIView 有 .isUserInteractionEnabled = true,但在我为其父视图设置 .isUserInteractionEnabled = true 之前,它没有响应点击。


Vit*_*aly 7

很可能你添加UIGestureRecognizer错误的地方.这是UIView来自的工作样本storyboard.如果您UIView动态创建,那么您应该将此初始化放在正确的构造函数中.

class TestView: UIView
{
    override func awakeFromNib()
    {
        self.userInteractionEnabled = true
        self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
    }

    func handleTap(gestureRecognizer: UITapGestureRecognizer)
    {
        println("Here")
    }
}
Run Code Online (Sandbox Code Playgroud)


May*_*hwa 7

经过多次反复试验,我找到了解决此问题的方法。所以有两个解决方案二这个

1.要么添加GestureRecognizerin viewDidLoad() 并转 userInteractionEnabled=true

2.如果使用计算属性,请使用lazy var而不是letto 属性。

lazy var profileImageView: UIImageView = {
    let iv = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    iv.image = #imageLiteral(resourceName: "gameofthrones_splash")
    iv.contentMode = .scaleAspectFill
    iv.translatesAutoresizingMaskIntoConstraints = false
    iv.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleSelectProfileImageView)))
    iv.isUserInteractionEnabled = true
    return iv
}()
Run Code Online (Sandbox Code Playgroud)


Jal*_*lxP 6

对于即使使用所有以前的答案仍然遇到问题的人,请确保您使用的是UITapGestureRecognizer而不是UIGestureRecognizer,我在试图找出问题所在时一直错过了这个细节。