UIStackView 中的自定义比例间距无需额外的子视图?

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

我知道我可以向

UIStackView
添加透明子视图并通过约束设置它们的宽度。问题是,如果我想隐藏一些不透明的子视图,它们之间的所有空间都会保留(而且我不知道如何正确“禁用”这些空间)。

我发现

setCustomSpacing(_:after:)
:

https://developer.apple.com/documentation/uikit/uistackview/2866023-setcustomspacing

问题是它设置了恒定的间距,但在我的情况下,不透明子视图具有恒定的宽度,并且它们之间的间距变化。

然后我找到了

customSpacing(after:)
并尝试覆盖它:

https://developer.apple.com/documentation/uikit/uistackview/2865827-customspacing

这似乎是最适合我的解决方案,但问题是重写方法永远不会被调用。

那么有没有正常的方法可以按比例间距将子视图添加到

UIStackView
中,并允许同时隐藏这些子视图及其间距?

ios swift uistackview spacing proportions
1个回答
0
投票

如果您的间距根据其他视图的尺寸动态变化,请在

layoutSubviews
中设置间距,如果您在 VC 中,则在
viewDidLayoutSubviews
中设置间距。这些是当某些视图的尺寸发生变化时将被调用的方法。在那里,您可以进行任何您喜欢的计算,并计算每个视图间距的值。

例如,这里我创建了一个带有 3 个标签的堆栈视图。第一个和第二个标签之间的间距等于堆栈视图宽度的 1/10,第二个和第三个标签之间的间距等于堆栈视图宽度的 1/20(也称为第一个标签的一半)。

var stack: UIStackView!

override func viewDidLoad() {
    func makeLabel(_ text: String) -> UILabel {
        let label = UILabel(frame: .zero)
        label.text = text
        label.backgroundColor = .green
        label.sizeToFit()
        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }
    stack = UIStackView(arrangedSubviews: [makeLabel("Foo Bar"), makeLabel("Something"), makeLabel("Else")])
    stack.axis = .horizontal
    stack.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(stack)
    NSLayoutConstraint.activate([
        view.centerYAnchor.constraint(equalTo: stack.centerYAnchor),
        stack.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10),
        stack.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -10)
    ])
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    stack.setCustomSpacing(stack.bounds.width / 10, after: stack.arrangedSubviews[0])
    stack.setCustomSpacing(stack.bounds.width / 20, after: stack.arrangedSubviews[1])
}
© www.soinside.com 2019 - 2024. All rights reserved.