【问题标题】:Can't find which view triggered the tap gesture recognizer in my custom view在我的自定义视图中找不到哪个视图触发了点击手势识别器
【发布时间】:2026-02-24 10:40:02
【问题描述】:

我知道很多问题都针对此类问题得到了解答,但就我而言,常见的答案不起作用。

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

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

这是我在 customView 中检测当前文本字段的代码

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
    }

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

if touch.view == self 

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

The demo project to see everything.

【问题讨论】:

  • 那么当输入焦点改变时,你改变小自定义视图的框架以与输入重叠?如果是这样,请将 gr 添加到自定义视图中,并为自定义视图提供一个属性,该属性设置为刚刚被框住的输入。那么您要查找的视图将是touch.view.theInputIAmFramedOver
  • 您需要检测这是哪个视图,因此这是哪个文本字段。
  • @danh 当输入焦点改变时,我删除我的视图并创建一个新的!我无法理解你在说什么......对不起。你检查我的演示项目了吗?
  • @matt 是的,当然...感谢您的帮助!

标签: swift uiview uikit uitapgesturerecognizer


【解决方案1】:

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

将您的 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
}

结果:

【讨论】:

  • 感谢上帝您的到来!谢谢!
【解决方案2】:

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

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

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

我建议您将其添加到UIViewControllerview。为此,您需要将两个视图传递给您的 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)
}

【讨论】:

    最近更新 更多