在我的自定义视图中找不到哪个视图触发了点击手势识别器
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
但在我的情况下它不起作用...
您需要检测矩形是否包含您触摸的点。您可以使用以下代码实现。
将您的 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
。为此,您需要将两个视图传递到您的 LContextView
:superview
和 anchorView
,您将在其上绑定约束
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)
}
我知道像这样的问题有很多答案,但就我而言,常见的答案不起作用。
我有一个自定义视图,它是一个显示在活动文本字段上方的小视图,用于显示剪贴板数据,因此如果用户想要该文本字段中的数据,请点击我的自定义视图,以便剪贴板文本自动粘贴到其中文本字段。
当页面上只有一个 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
但在我的情况下它不起作用...
您需要检测矩形是否包含您触摸的点。您可以使用以下代码实现。
将您的 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
。为此,您需要将两个视图传递到您的 LContextView
:superview
和 anchorView
,您将在其上绑定约束
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)
}