我正试图检测用户何时点击UIStackView中的项目。子类化UIStackView并重写hitTest和pointInside不起作用。那些只在我点击一个项目时被调用。
有没有办法实现这个目标?
谢谢!
您需要在堆叠视图中添加轻敲手势识别器。
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(stackViewTapped))
tapGesture.numberOfTapsRequired = 1
self.stackView.addGestureRecognizer(tapGesture)
@objc func stackViewTapped() {
print("Stack View tapped")
}
您可以在UIStackView之间添加透明视图而不是空格。
你可以找到一个样本here
问题是,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,因此操作系统沿视图链向下,直到其中一个匹配为止。
我建议你在UIStackView
上添加一个非文本按钮,并将其用作分隔符。因此,您可以为按钮添加IBAction
。
如果你向UIGestureRecognizer
添加一个UIView然后一个UIView
,你可以达到相同的效果。
如何添加UIGestureRecognizer
检查this link