强制标签显示其文字

时间:2018-10-08 16:57:46

标签: ios swift uilabel uistackview

我想包含类似于reddit应用程序的投票功能。我认为UIStackView会是完美的选择。现在,我正在努力使在“投票”和“投票”按钮之间的标签显示其文本。

Fail

我尝试将contentCompression更改为.fittingSizeLevel.defaultHigh,但这似乎没有任何改变。在您可以看到的图像上,将有足够的空间适合整个文本,但事实并非如此。我缺少什么方面?

class VotingStackView: UIStackView {

    let arrowUpButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.tintColor = GSSettings.UI.Colors.tintColor
        button.imageView?.contentMode = .scaleAspectFit
        button.contentEdgeInsets = UIEdgeInsets(top: 16, left: 0, bottom: 16, right: 0)
        button.clipsToBounds = true
        return button
    }()

    let arrowDownButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.tintColor = GSSettings.UI.Colors.tintColor
        button.imageView?.contentMode = .scaleAspectFit
        button.contentEdgeInsets = UIEdgeInsets(top: 16, left: 0, bottom: 16, right: 0)
        button.clipsToBounds = true
        return button
    }()

    let percentageLabel: UILabel = {
        let label = UILabel()
        label.text = "100%"
        label.textColor = GSSettings.UI.Colors.regularTextColor
        label.font = GSSettings.UI.Fonts.helveticaLight?.withSize(20)
        label.clipsToBounds = false
        label.setContentCompressionResistancePriority(UILayoutPriority.fittingSizeLevel, for: .horizontal)
        return label
    }()

    var views: [UIView] = [UIView]()

    //MARK: - Init & View Loading
    override init(frame: CGRect) {
        super.init(frame: frame)
        views = [arrowUpButton, percentageLabel ,arrowDownButton]
        setupStackView()
        setupImages()
        setupSubviews()
    }

    //MARK: - Setup
    func setupStackView() {
        self.axis           = .horizontal
        self.spacing        = 0
        self.alignment      = .center
        self.distribution   = .fillEqually
    }

    func setupImages() {
        let upImage = UIImage(named: "arrow_up")
        let downImage = UIImage(named: "arrow_down")

        arrowUpButton.setImage(upImage, for: .normal)
        arrowDownButton.setImage(downImage, for: .normal)
    }

    func setupSubviews() {
        for view in views {
            addArrangedSubview(view)
        }
        layoutIfNeeded()
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

votingStackView是另一个StackView的一部分:

class BottomStackView: UIStackView {

    let votingStackView: VotingStackView = {
        let stackview = VotingStackView()
        return stackview
    }()

    let addFriendButton: UIButton = {
        let button = UIButton()
        button.backgroundColor = .clear
        button.tintColor = GSSettings.UI.Colors.tintColor
        button.setImage(UIImage(named: "plus")?.withRenderingMode(.alwaysTemplate), for: .normal)
        return button
    }()

    let redView: UIView = {
        let view = UIView()
        view.backgroundColor = .red
        return view
    }()

    var views: [UIView] = [UIView]()

    //MARK: - Init & View Loading
    override init(frame: CGRect) {
        super.init(frame: frame)
        views = [votingStackView, addFriendButton, redView]
        setupStackView()
        setupSubviews()
    }

    //MARK: - Setup
    func setupStackView() {
        self.axis           = .horizontal
        self.spacing        = 0
        self.alignment      = .leading
        self.distribution   = .fillEqually
    }

    func setupSubviews() {
        for view in views {
            addArrangedSubview(view)
        }
        layoutIfNeeded()
    }

    required init(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

1 个答案:

答案 0 :(得分:0)

更改

label.setContentCompressionResistancePriority(UILayoutPriority.fittingSizeLevel, for: .horizontal)

label.setContentCompressionResistancePriority(UILayoutPriority.defaultHigh, for: .horizontal)

docs看来,fittingSizeLevel并未考虑到父约束,因此使用defaultHigh似乎是更安全的选择。