Я новичок в Swift и сейчас пытаюсь создать поле ввода. Моя проблема в том, что я хотел бы иметь метку, как показано на рисунке:
Пока что я работаю со 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)
])
Этот код дает ожидаемый результат для английского языка, однако мне нужно реализовать его на разных языках, поэтому я не могу использовать постоянную ширину.
Может ли кто-нибудь сказать мне, как изменить мой код, чтобы мне не нужно постоянное ограничение, но ширина метки настраивается на длину слова?
заранее спасибо
Я думаю, вы могли бы использовать NSLayoutConstraint.activate([
titleLabel.widthAnchor.constraint(greaterThanOrEqualToConstant: 0)]
, чтобы позволить ему расти в зависимости от контента.
В вашем коде 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% размера). Спасибо!
Работает так, как мне нужно! Люблю тебя, просто спас мой день :)
Это работает... со статическим текстом. Если вы попытаетесь изменить titleLabel.text
после размещения элементов, ширина titleLabel
не изменится. Если это не проблема, ничего страшного... просто предостережение.
Пара вещей...
Я предполагаю, что вы хотите, чтобы «метка заголовка» была выровнена по верхнему краю вашего 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)
// ])
Результат:
к сожалению, это не сработало для меня. Слово (название) обрезается и заканчивается ... Спасибо за вклад!