Как сделать горизонтальный StackView, чтобы он имел ширину первого элемента и заполнил остальную часть

Я новичок в Swift и сейчас пытаюсь создать поле ввода. Моя проблема в том, что я хотел бы иметь метку, как показано на рисунке:

Как сделать горизонтальный StackView, чтобы он имел ширину первого элемента и заполнил остальную часть

Пока что я работаю со StackViews: один вертикальный для полей ввода и три горизонтальных для заголовка и пользовательского ввода. Мой код пока выглядит следующим образом:

// Initialize outter stackview
    let feedbackOutterSV = UIStackView()
    view.addSubview(feedbackOutterSV)
    feedbackOutterSV.translatesAutoresizingMaskIntoConstraints = false
    feedbackOutterSV.axis = NSLayoutConstraint.Axis.vertical
    NSLayoutConstraint.activate([
        feedbackOutterSV.topAnchor.constraint(equalTo: tutorialText.bottomAnchor, constant: 10),
        feedbackOutterSV.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
        feedbackOutterSV.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
        feedbackOutterSV.heightAnchor.constraint(equalToConstant: 300)
    ])

    // Initalize inner stackview for title
    let feedbackInnerSVTitle = UIStackView()
    feedbackOutterSV.addArrangedSubview(feedbackInnerSVTitle)
    feedbackInnerSVTitle.translatesAutoresizingMaskIntoConstraints = false
    feedbackInnerSVTitle.axis = .horizontal
    feedbackInnerSVTitle.alignment = .fill
    feedbackInnerSVTitle.distribution = .fillProportionally

    let titleLabel = UILabel()
    feedbackInnerSVTitle.addArrangedSubview(titleLabel)
    titleLabel.translatesAutoresizingMaskIntoConstraints = false
    titleLabel.text = "feedback.input.title".localize()
    titleLabel.font = UIFont.preferredFont(forTextStyle: .body)
    titleLabel.textColor = .gray

    let titleTextView = UITextView()
    feedbackInnerSVTitle.addArrangedSubview(titleTextView)
    titleTextView.translatesAutoresizingMaskIntoConstraints = false
    titleTextView.font = UIFont.preferredFont(forTextStyle: .body)
    titleTextView.isScrollEnabled = false

    NSLayoutConstraint.activate([
        titleLabel.widthAnchor.constraint(equalToConstant: 39)
    ])

Этот код дает ожидаемый результат для английского языка, однако мне нужно реализовать его на разных языках, поэтому я не могу использовать постоянную ширину.

Как сделать горизонтальный StackView, чтобы он имел ширину первого элемента и заполнил остальную часть

Может ли кто-нибудь сказать мне, как изменить мой код, чтобы мне не нужно постоянное ограничение, но ширина метки настраивается на длину слова?

заранее спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
371
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, вы могли бы использовать NSLayoutConstraint.activate([ titleLabel.widthAnchor.constraint(greaterThanOrEqualToConstant: 0)], чтобы позволить ему расти в зависимости от контента.

к сожалению, это не сработало для меня. Слово (название) обрезается и заканчивается ... Спасибо за вклад!

DonFattie 28.05.2019 13:43
Ответ принят как подходящий

В вашем коде width constraint на titleLabel должно быть установлено на titleLabel.intrinsicContentSize.width

NSLayoutConstraint.activate([
   titleLabel.widthAnchor.constraint(equalToConstant: titleLabel.intrinsicContentSize.width)
])

Кроме того, установите distribution из feedbackInnerSVTitle как .fill

feedbackInnerSVTitle.distribution = .fill

Я попробовал ваше предложение, когда я изменяю код таким образом, он просто разбивает представление стека пополам (у Label есть 50% размера, а у TextView - 50% размера). Спасибо!

DonFattie 28.05.2019 13:54

Работает так, как мне нужно! Люблю тебя, просто спас мой день :)

DonFattie 28.05.2019 13:58

Это работает... со статическим текстом. Если вы попытаетесь изменить titleLabel.text после размещения элементов, ширина titleLabel не изменится. Если это не проблема, ничего страшного... просто предостережение.

DonMag 28.05.2019 14:05

Пара вещей...

Я предполагаю, что вы хотите, чтобы «метка заголовка» была выровнена по верхнему краю вашего textView, поэтому измените .fill на .top:

    feedbackInnerSVTitle.alignment = .top // .fill

и не используйте .fillProportionally

    feedbackInnerSVTitle.distribution = .fill // .fillProportionally

Теперь вы, вероятно, увидите, что каждый элемент занимает 50% ширины, поэтому измените приоритет content hugging для метки заголовка:

    titleLabel.setContentHuggingPriority(.required, for: .horizontal)

и, наконец, не устанавливает ограничение ширины для вашего заголовка:

//      NSLayoutConstraint.activate([
//          titleLabel.widthAnchor.constraint(equalToConstant: 39)
//          ])

Результат:

Другие вопросы по теме