我正在尝试检测用户何时在UIStackView中的项目之间点击。子类化UIStackView并覆盖hitTest和pointInside不起作用。那些只有在我点击项目时才会被呼叫。
有什么办法可以做到这一点?
谢谢!
答案 0 :(得分:3)
您需要将轻击手势识别器添加到堆栈视图。
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(stackViewTapped))
tapGesture.numberOfTapsRequired = 1
self.stackView.addGestureRecognizer(tapGesture)
@objc func stackViewTapped() {
print("Stack View tapped")
}
答案 1 :(得分:2)
您可以添加透明视图而不是UIStackView之间的空间。
您可以找到一个示例here
答案 2 :(得分:1)
问题在于iOS无法以某种方式跟踪透明的视图。因此,我最终添加了一个几乎透明视图,该视图恢复了项目之间的跟踪:
let invisibleTrackingView = InvisibleTrackingView(frame: mainStackView.frame)
invisibleTrackingView.backgroundColor = UIColor.clear.withAlphaComponent(0.001)
mainStackView.addSubview(invisibleTrackingView)
class InvisibleTrackingView: UIView {
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
return false
}
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
return nil
}
}
0.001值是将起作用的最低值,并且该值太低以致于视图实际上是透明的。由于视图返回false和nil,因此操作系统沿视图链向下移动,直到其中一个匹配为止。
答案 3 :(得分:0)
我建议您在UIStackView
上添加一个非文本按钮,并将其用作分隔符。因此,您可以为按钮添加IBAction
。
如果先添加UIView,然后向UIGestureRecognizer
添加UIView
,则可以达到相同的效果。
有关如何添加UIGestureRecognizer
支票this link