【发布时间】:2019-02-21 15:20:36
【问题描述】:
我正在尝试检测用户何时在 UIStackView 中的项目之间点击。继承 UIStackView 并覆盖 hitTest 和 pointInside 不起作用。只有当我点击一个项目时才会调用它们。
有什么办法可以做到吗?
谢谢!
【问题讨论】:
标签: ios swift uikit uistackview
我正在尝试检测用户何时在 UIStackView 中的项目之间点击。继承 UIStackView 并覆盖 hitTest 和 pointInside 不起作用。只有当我点击一个项目时才会调用它们。
有什么办法可以做到吗?
谢谢!
【问题讨论】:
标签: ios swift uikit uistackview
您可以添加透明视图而不是 UIStackView 之间的空间。
您可以找到示例here
【讨论】:
您需要将点击手势识别器添加到堆栈视图。
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(stackViewTapped))
tapGesture.numberOfTapsRequired = 1
self.stackView.addGestureRecognizer(tapGesture)
@objc func stackViewTapped() {
print("Stack View tapped")
}
【讨论】:
问题在于不知何故 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。
如果您添加一个 UIView,然后将一个 UIGestureRecognizer 添加到 UIView,您可以达到相同的效果。
关于如何添加UIGestureRecognizer,请查看this link
【讨论】: