自定义视图添加UITapGestureRecognizer后无法定位触发手势的对应视图
问题根因
- 你当前的触摸判断逻辑采用
frame.contains计算不准,且手势绑定在window层级,点击自定义视图的子视图时touch.view不等于自定义视图本身,所以通用的touch.view == self判断无法命中。 - 你没有跟踪当前处于激活状态的第一响应者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
相关产品推荐
相关产品推荐

