为什么我的视图不响应使用 gestureRecognizer 的手势?

Why doesn't my View respond to a gesture using a gestureRecognizer?

刚花了一天的时间在键盘上敲打我的头,我想我会分享我的诊断和解决方案。

情况:您将自定义 class CardView 的自定义视图添加到应用中的封闭视图 myCards 中,并希望每张卡片响应点击手势(例如表明你想弃牌)。您开始的典型代码:

在你的ViewController中:

class MyVC : UIViewController, UIGestureRecognizerDelegate {
...
    func discardedCard(sender: UITapGestureRecognizer) {
        let cv : CardView = sender.view! as! CardView
         ...
    }

在您的 myCards 构造中:

cv  = CardView(card: card)
myCards.addSubview(cv)
cv.userInteractionEnabled = true
...
let cvTap = UITapGestureRecognizer(target: self, action: Selector("discardedCard:"))
cvTap.delegate = self
cv.addGestureRecognizer(cvTap)

我发现这里的论点非常混乱,文档也没有任何帮助。目前尚不清楚 target: argument 指的是实现 discardedCard(sender: UITapGestureRecognizer) 的 class 。如果您要在 ViewController 中构建识别器和卡片,那将是 self。如果您想将 discardedCard 移动到自定义视图 class 中(例如),则在我的示例中将 self 替换为 CardView,包括在委托行中。

测试上面的代码,我发现discardedCard函数并没有被调用。发生了什么事?

所以一天后,这就是我必须解决的问题。我希望这份清单对其他人有用。我是 iOS 的新手(来自 Android),所以对你们这些老手来说可能很明显:

  1. 确保触摸视图(示例中的cv)具有userInteractionEnabled=true。请注意,如果您使用自己的构造函数,它将默认设置为 false
  2. 确保所有封闭视图也有userInteractionEnabled=true
  3. 其他人发帖说 delegate 语句和 addGestureRecognizer 语句的顺序有所不同;我没有发现使用 Xcode 7.2 和 iOS 9.2
  4. 最重要的是:确保您触摸的视图完全在封闭视图的范围内。在我的例子中,我正在构建一个 myCards 容器,它没有正确设置宽度并且正在切断 right-most 卡片(并且由于默认情况下禁用剪裁,这在视觉上并不明显,直到我查看了视图层次结构中的调试器)