Распределение представления стека с динамической шириной метки

У меня есть UIStackView, однако первое представление subViews — это UILabel, и оно не соответствует его размеру.

Мой код приведен ниже;

private let stackView: UIStackView = {
    let view = UIStackView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.axis = .horizontal
    view.distribution = .fillProportionally
    view.alignment = .trailing
    view.spacing = 8
    return view
}()

и я, конечно, добавляю свой subViews в init, как показано ниже;

    stackView.addArrangedSubview(currentBidLabel)
    stackView.addArrangedSubview(seperator)
    stackView.addArrangedSubview(adCreatedAtLabel)
    stackView.addArrangedSubview(moreButton)

Мой текущий результат соответствует иллюстрации ниже;

иллюстрация

Результат, который я ищу, следующий:

  1. Красный = динамическая ширина метки (такая же, как у синего)
  2. Зеленый = фиксированная ширина
  3. Синий = заполнить оставшееся пространство
  4. Голубой = фиксированная ширина

person David Lintin    schedule 20.12.2019    source источник
comment
горизонтальное представление стека не соответствует выравниванию .trailing. Вместо этого вы должны использовать .fill/.top/.center/.bottom. Вам нужны 400 дирхамов ОАЭ и 1 день назад, обе этикетки имеют одинаковую ширину?   -  person nayem    schedule 20.12.2019
comment
Когда я заполняю пропорционально, я получаю представления, разбитые на 0 ширины...   -  person ScottyBlades    schedule 02.06.2021


Ответы (1)


Вы должны установить желаемое ContentHuggingPriority для каждой метки. Следующая настройка будет соответствовать вашим потребностям

redLabel.setContentHuggingPriority(. required, for: .horizontal)
greenLabel.setContentHuggingPriority(.required, for: .horizontal)
blueLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
cyanLabel.setContentHuggingPriority(.required, for: .horizontal)
  • defaultLow означает заполнить остальные.
  • required означает "подгонка первой".

И другие значения должны быть между этими двумя.

person Mojtaba Hosseini    schedule 20.12.2019
comment
Предоставленное изображение является примером моего существующего результата. Мне нужно, чтобы красная метка была такой же ширины, как текст, а синий заполнял оставшееся пространство. - person David Lintin; 20.12.2019
comment
Можете ли вы разместить изображение того, как вы хотите, чтобы это было? - person Mojtaba Hosseini; 20.12.2019
comment
У меня есть желаемый результат по красному = .required | зеленый = .required | синий = .defaultLow | голубой = .required (пожалуйста, обновите свой ответ, чтобы я мог принять) - person David Lintin; 20.12.2019
comment
хм. Я неправильно понял ваш пример. Я рад, что вы исправили свою проблему - person Mojtaba Hosseini; 20.12.2019