这就是
viewDidLoad
上的样子:
有时我需要刷新它,所以我只需从 UIStackView 中删除所有子视图,然后使用更新的数据再次添加它们。为什么后来缩小了?
如何避免缩水?
如何清除我的 UIStackView?
extension UIStackView {
func clear() {
arrangedSubviews.forEach { subview in
removeArrangedSubview(subview)
subview.removeFromSuperview()
}
}
}
如何定义 UIStackView 元素的子视图?只有 3 个子视图。
class VoteAnswerView: UIView {
init(title: String, info: String) {
super.init(frame: .zero)
setup()
titleLabel.text = title
infoPercentageLabel.text = info
}
func setup() {
addSubview(progressView)
progressView.snp.makeConstraints { maker in
maker.leading.trailing.equalToSuperview().inset(20)
maker.height.equalTo(6)
maker.bottom.equalToSuperview()
}
addSubview(titleLabel)
titleLabel.snp.makeConstraints { maker in
maker.leading.equalTo(progressView)
maker.top.equalTo(18)
maker.bottom.equalTo(progressView.snp.top).offset(-10)
}
addSubview(infoPercentageLabel)
infoPercentageLabel.snp.makeConstraints { maker in
maker.bottom.equalTo(titleLabel)
maker.leading.equalTo(titleLabel.snp.trailing).offset(10)
maker.trailing.equalTo(progressView)
}
titleLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
titleLabel.setContentCompressionResistancePriority(.required, for: .vertical)
infoPercentageLabel.setContentCompressionResistancePriority(.required, for: .horizontal)
infoPercentageLabel.setContentHuggingPriority(.required, for: .horizontal)
}
}
let stackView = UIStackView()
// and when I need to update it, all I do is
stackView.clear()
//answers is just an array of data
answers.forEach { answer in
let view = VoteAnswerView(title: answer.title, info: answer.info)
stackView.addArrangedSubview(view)
}
这不起作用。为什么?
遇到以自动布局方式定义的布局并不少见,自动布局需要一点帮助才能获得所需的结果。
将此添加到您的
VoteAnswerView
课程中:
override func layoutSubviews() {
super.layoutSubviews()
// during dev, output to debug console to make sure we're not
// causing an infinite loop
print(#function)
titleLabel.invalidateIntrinsicContentSize()
}
顺便说一句:即使您认为没有必要,提供一个最小的可重现示例可以让某人更加更轻松地提供帮助。