检测UIStackView间距(项目之间)的分接头

问题描述 投票:1回答:4

我正试图检测用户何时点击UIStackView中的项目。子类化UIStackView并重写hitTest和pointInside不起作用。那些只在我点击一个项目时被调用。

有没有办法实现这个目标?

谢谢!

ios swift uikit uistackview
4个回答
3
投票

您需要在堆叠视图中添加轻敲手势识别器。

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(stackViewTapped))
tapGesture.numberOfTapsRequired = 1
self.stackView.addGestureRecognizer(tapGesture)

@objc func stackViewTapped() {
     print("Stack View tapped")
}

2
投票

您可以在UIStackView之间添加透明视图而不是空格。

步骤1:添加视图并在堆栈视图中使间距为Add view and make spacing zero

第2步:使视图颜色透明enter image description here

第3步:将Tap Gesture添加到此视图enter image description here

第4步:向手势添加动作并相应地处理它enter image description here

你可以找到一个样本here


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,因此操作系统沿视图链向下,直到其中一个匹配为止。


0
投票

我建议你在UIStackView上添加一个非文本按钮,并将其用作分隔符。因此,您可以为按钮添加IBAction

如果你向UIGestureRecognizer添加一个UIView然后一个UIView,你可以达到相同的效果。

如何添加UIGestureRecognizer检查this link

© www.soinside.com 2019 - 2024. All rights reserved.