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

时间:2015-12-31 23:11:36

标签: ios swift uigesturerecognizer

刚刚花了一天时间撞击键盘,我想我会分享我的诊断和解决方案。

情况:您将自定义视图的自定义类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)的类。如果您要在ViewController中构建识别器和卡片,那将是self。如果您想将discardedCard移到自定义View类中(例如),请在我的示例中将self替换为CardView,包括代理行。

测试上面的代码,我发现从未调用abandonedCard函数。发生了什么事?

1 个答案:

答案 0 :(得分:1)

所以一天之后,这就是我必须解决的问题。我希望这份清单对其他人有用。我是iOS的新手(来自Android),所以对于你的退伍军人来说可能是显而易见的:

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