UILabel 在 UIStackView 中重新排列后缩小了

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

这就是

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)
}

这不起作用。为什么?

ios swift nslayoutconstraint
1个回答
0
投票

遇到以自动布局方式定义的布局并不少见,自动布局需要一点帮助才能获得所需的结果。

将此添加到您的

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()
}

顺便说一句:即使您认为没有必要,提供一个最小的可重现示例可以让某人更加更轻松地提供帮助。

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