检测UIStackView间距中的拍子(项目之间)

时间:2019-02-21 15:20:36

标签: ios swift uikit uistackview

我正在尝试检测用户何时在UIStackView中的项目之间点击。子类化UIStackView并覆盖hitTest和pointInside不起作用。那些只有在我点击项目时才会被呼叫。

有什么办法可以做到这一点?

谢谢!

4 个答案:

答案 0 :(得分:3)

您需要将轻击手势识别器添加到堆栈视图。

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

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

答案 1 :(得分:2)

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

第1步:添加一个视图并使堆栈视图中的间距为零 Add view and make spacing zero

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

第3步:在此视图中添加点击手势 enter image description here

第4步:将动作添加到手势并相应地进行处理 enter image description here

您可以找到一个示例here

答案 2 :(得分: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,因此操作系统沿视图链向下移动,直到其中一个匹配为止。

答案 3 :(得分:0)

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

如果先添加UIView,然后向UIGestureRecognizer添加UIView,则可以达到相同的效果。

有关如何添加UIGestureRecognizer支票this link