视图层次结构就是这样,
- control (UIView)
- container (UIView)
- icon (UILabel)
- label(UILabel)
如果我尝试在控件上添加轻击手势,则效果很好。如果我尝试在其他任何项上添加addTap手势,则无法使用。
为每个元素启用 isUserInteractionEnabled
。我还为每个元素都叫BringToFront
。
我还尝试设置UIGestureRecognizerDelegate
和检测Touch
事件,但它也没有检测到。
有什么主意吗?
这是代码,
func setGesture() {
// self.isUserInteractionEnabled = true
// containerView.isUserInteractionEnabled = true
label.isUserInteractionEnabled = true
// exclamationMark.isUserInteractionEnabled = true
self.bringSubview(toFront: containerView)
containerView.bringSubview(toFront: exclamationMark)
label.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapSavingLabel)))
//exclamationMark.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(didTapExclamationMarkButton)))
//self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(selfTapped)))
}
@objc func didTapExclamationMarkButton() {
delegate?.didTapExclamationMarkButton()
}
@objc func didTapSavingLabel() {
delegate?.didTapSavingLabel()
}
@objc func selfTapped() {
print("Self Tapped")
}
如果我取消注释“自拍”上的“轻按”手势,则效果很好。
答案 0 :(得分:0)
我在Interface Builder中创建了插座,并连接到label
变量。
已更新为新答案。 我认为您对标签有“惊叹号”视图。
其余的是下一个代码。
- controller
-- container
--- label
class ViewController: UIViewController {
@IBOutlet weak var container: UIView!
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
self.label.isUserInteractionEnabled = true
self.view.bringSubviewToFront(self.container)
let tap = UITapGestureRecognizer(target: self, action: #selector(tapPerformed(_:)))
self.label.addGestureRecognizer(tap)
}
@objc func tapPerformed(_ tap: UITapGestureRecognizer) {
debugPrint(#function)
}
}
答案 1 :(得分:0)
问题是标签的一个或多个超级视图的帧大小为0,0
。当该视图的.clipsToBounds
属性为false
时,它允许在屏幕上看到其子视图(在这种情况下为标签),但它扩展到其超级视图的范围之外。
在这种情况下的任何视图将不响应触摸/手势。
一旦解决了布局问题并正确设置了框架,添加到标签中的Tap Gesture就会按预期工作。