检测 UIStackView 间距中的点击(项目之间)
Posted
技术标签:
【中文标题】检测 UIStackView 间距中的点击(项目之间)【英文标题】:Detecting taps in UIStackView spacing (between items) 【发布时间】:2019-02-21 15:20:36 【问题描述】:我正在尝试检测用户何时在 UIStackView 中的项目之间点击。继承 UIStackView 并覆盖 hitTest 和 pointInside 不起作用。只有当我点击一个项目时才会调用它们。
有什么办法可以做到吗?
谢谢!
【问题讨论】:
【参考方案1】:您可以添加透明视图而不是 UIStackView 之间的空间。
第 1 步:添加视图并使堆栈视图中的间距为零
第 2 步:使视图颜色透明
第 3 步:将点按手势添加到此视图
第 4 步:为手势添加动作并进行相应处理
您可以找到示例here
【讨论】:
【参考方案2】:您需要将点击手势识别器添加到堆栈视图。
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(stackViewTapped))
tapGesture.numberOfTapsRequired = 1
self.stackView.addGestureRecognizer(tapGesture)
@objc func stackViewTapped()
print("Stack View tapped")
【讨论】:
【参考方案3】:问题在于不知何故 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,操作系统会沿着视图链向下移动,直到其中一个匹配。
【讨论】:
【参考方案4】:我建议您向UIStackView
添加一个非文本按钮并将其用作分隔符。因此,您可以为按钮添加IBAction
。
如果您添加一个 UIView,然后将一个 UIGestureRecognizer
添加到 UIView
,您可以达到相同的效果。
关于如何添加UIGestureRecognizer
,请查看this link
【讨论】:
以上是关于检测 UIStackView 间距中的点击(项目之间)的主要内容,如果未能解决你的问题,请参考以下文章