Заставить ярлык отображать его текст - PullRequest
0 голосов
/ 08 октября 2018

Я хочу включить функцию голосования, похожую на приложение reddit.Я думаю, что UIStackView было бы идеально для этого.Сейчас я пытаюсь сделать так, чтобы метка между кнопками голосования и понижения отображала текст.

Fail

Я пытался изменитьсжатие содержимого до .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")
    }
}

Параметр голосования со стэком является частью другого представления стека:

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 голосов
/ 08 октября 2018

Изменить

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

на

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

Из документов кажется, что fittingSizeLevel не учитывает родительские ограничения, поэтому использование defaultHigh кажется более безопасным вариантом.

...