我知道我可以向
UIStackView
添加透明子视图并通过约束设置它们的宽度。问题是,如果我想隐藏一些不透明的子视图,它们之间的所有空间都会保留(而且我不知道如何正确“禁用”这些空间)。
我发现
setCustomSpacing(_:after:)
:
https://developer.apple.com/documentation/uikit/uistackview/2866023-setcustomspacing
问题是它设置了恒定的间距,但在我的情况下,不透明子视图具有恒定的宽度,并且它们之间的间距变化。
然后我找到了
customSpacing(after:)
并尝试覆盖它:
https://developer.apple.com/documentation/uikit/uistackview/2865827-customspacing
这似乎是最适合我的解决方案,但问题是重写方法永远不会被调用。
那么有没有正常的方法可以按比例间距将子视图添加到
UIStackView
中,并允许同时隐藏这些子视图及其间距?
如果您的间距根据其他视图的尺寸动态变化,请在
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])
}