检测 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 间距中的点击(项目之间)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIStackView 中等间距标签?

Xcode (Swift) 中的 UI:我只想要 UIStackView 的折叠功能,而不是标准化间距。还值得用吗?

具有静态间距的UIStackView子类

UIStackView 的约束在设置间距时中断

UIStackView 等间距,包括边缘

如何在视图之间创建具有可变间距的 UIStackView?