You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义视图添加UITapGestureRecognizer后无法定位触发手势的对应视图

问题根因
  1. 你当前的触摸判断逻辑采用frame.contains计算不准,且手势绑定在window层级,点击自定义视图的子视图时touch.view不等于自定义视图本身,所以通用的touch.view == self判断无法命中。
  2. 你没有跟踪当前处于激活状态的第一响应者UITextField,多输入框场景下无法确定粘贴目标。
修复方案

1. 修正自定义视图点击识别逻辑

替换原有的手势代理方法,通过坐标转换判断点击位置是否落在自定义视图范围内:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
    let touchPoint = touch.location(in: self)
    if self.bounds.contains(touchPoint) {
        tapComple?(true)
    } else {
        tapComple?(false)
    }
    return true
}

2. 获取当前激活的UITextField作为粘贴目标

新增UIResponder扩展获取全局第一响应者,不需要手动维护输入框引用:

extension UIResponder {
    static var currentFirstResponder: UIResponder? {
        _currentFirstResponder = nil
        UIApplication.shared.sendAction(#selector(findFirstResponder(_:)), to: nil, from: nil, for: nil)
        return _currentFirstResponder
    }
    
    private static weak var _currentFirstResponder: UIResponder?
    
    @objc private func findFirstResponder(_ sender: Any) {
        Self._currentFirstResponder = self
    }
}

3. 粘贴逻辑直接调用第一响应者赋值

在你的点击事件tapAction中直接获取当前激活的输入框完成粘贴:

@objc private func tapAction() {
    guard let activeTextField = UIResponder.currentFirstResponder as? UITextField,
          let pasteContent = UIPasteboard.general.string else { return }
    // 支持光标位置插入内容,不会直接覆盖全量文本
    activeTextField.insertText(pasteContent)
}
优化建议
  • 自定义视图显示时再添加手势,隐藏/销毁时移除手势,避免重复添加和手势冲突
  • 也可以在自定义视图弹出时就记录当前第一响应者,点击时直接使用记录的输入框引用,性能更优

内容的提问来源于stack exchange,提问作者Ahmadreza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:24:02