在我的自定义视图中找不到哪个视图触发了点击手势识别器

Can't find which view triggered the tap gesture recognizer in my custom view

我知道像这样的问题有很多答案,但就我而言,常见的答案不起作用。

我有一个自定义视图,它是一个显示在活动文本字段上方的小视图,用于显示剪贴板数据,因此如果用户想要该文本字段中的数据,请点击我的自定义视图,以便剪贴板文本自动粘贴到其中文本字段。

当页面上只有一个 textField 时一切正常。但是如果我添加另一个 textField,此自定义视图将无法检测到正确的 textField 以将文本粘贴到其中。

这是我在自定义视图中检测当前文本字段的代码

private func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(tapAction))
    tap.cancelsTouchesInView = true
    tap.delegate = self
    window?.addGestureRecognizer(tap)
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if touch.view!.frame.contains(subviews.first!.frame) {
            tapComple?(true)
        } else {
            tapComple?(false)
        }
        return true
    }

我知道 Whosebug 上的其他答案已经在使用这个:

if touch.view == self 

但在我的情况下它不起作用...

The demo project to see everything.

您需要检测矩形是否包含您触摸的点。您可以使用以下代码实现。

将您的 gestureRecognizer(_:shouldRecieve:) 方法更改为以下内容:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    if subviews.first?.frame.contains(touch.location(in: subviews.first)) == true {
        print(true)
        tapComple?(true)
    } else {
        print(false)
        tapComple?(false)
    }
    return true
}

结果:

您不需要进行任何计算或监听手势识别器委托。

您可以在 window 上在您自己的视图中添加点击手势识别器。所以它收到的所有水龙头都是正确的。

另外,现在您正在将视图作为子视图添加到文本字段。这确实是一种糟糕的做法,并且会阻止此视图接收点击。

相反,我建议您将其添加到 UIViewController view。为此,您需要将两个视图传递到您的 LContextViewsuperviewanchorView,您将在其上绑定约束

private func configView(superView: UIView, anchorView: UIView, size: CGSize) {
    removePreviusContexes(superView: superView)
    superView.addSubview(self)
    backgroundColor = .white
    translatesAutoresizingMaskIntoConstraints = false
    widthAnchor.constraint(equalToConstant: size.width).isActive = true
    heightAnchor.constraint(equalToConstant: size.height).isActive = true
    centerXAnchor.constraint(equalTo: anchorView.centerXAnchor).isActive = true
    centerYAnchor.constraint(equalTo: anchorView.centerYAnchor, constant: -50).isActive = true
    ...
private func addTapGesture() {
    let tap = UITapGestureRecognizer(target: self, action: #selector(tapAction))
    addGestureRecognizer(tap)
}