Многострочная метка в UIStackView
при помещении многострочной метки (с linebreak, установленным в word Wrap) в представление стека, метка немедленно теряет linebreak и отображает текст метки в одной строке вместо этого.
Почему это происходит и как сохранить многострочных меток в виде стека?
13 ответов:
- вставить
UILabel
внутриUIView
(Редактор - > Вставить - > Вид)- используйте ограничения, чтобы соответствовать
UILabel
доUIView
(например, конечное пространство, верхнее пространство и ведущее пространство для ограничений супервизора)The
UIStackView
будет растянутьUIView
чтобы соответствовать должным образом, иUIView
будет сдерживатьUILabel
на несколько строк.
- Сначала установите количество строк метки в 0
- вид стека по-прежнему не будет расти до
multiLine
Если вы даете ему фиксированную ширину. Когда мы фиксируем его ширину, то он разбивается на несколько строк, когда эта ширина достигается, как показано:если мы не даем фиксированную ширину для представления стека, потом все становится неоднозначным. Как долго будет расти представление стека с меткой (если значение метки динамическое)?
надеюсь, что это может исправить вашу проблему.
для горизонтального вида стека, который имеет
UILabel
в качестве одного из своих взглядов, в интерфейсе строителя, во-первых, установитьlabel.numberOfLines = 0
. Это должно привести к этикетке, чтобы иметь больше чем 1 линию. Это изначально не сработало для меня, когда представление стека былоlabel.alignment = .fill
. Чтобы заставить его работать, просто установитеlabel.alignment = .center
. Теперь метка может расширяться до нескольких строк внутриUIStackView
.The документация Apple говорит
для всех трасс, кроме трассы заливки, стек просмотр использует каждый собственность intrinsicContentSize организованы представления, при расчете его размер перпендикулярен оси стека
обратите внимание на слово за исключением здесь. Когда
.fill
используется горизонтальнаяUIStackView
не изменяет размер по вертикали, используя размеры расположенных подвидов.
ниже приведена игровая площадка реализации многострочной метки с разрывом строки внутри
UIStackView
. Это не требует встраиванияUILabel
внутри ничего и был протестирован с Xcode 9.2 и Swift 4. Надеюсь, это поможет.import UIKit import PlaygroundSupport let containerView = UIView() containerView.frame = CGRect.init(x: 0, y: 0, width: 400, height: 500) containerView.backgroundColor = UIColor.white var label = UILabel.init() label.textColor = .black label.numberOfLines = 0 label.translatesAutoresizingMaskIntoConstraints = false label.text = "This is an example of sample text that goes on for a long time. This is an example of sample text that goes on for a long time." let stackView = UIStackView.init(arrangedSubviews: [label]) stackView.translatesAutoresizingMaskIntoConstraints = false stackView.axis = .vertical stackView.distribution = .fill stackView.alignment = .fill containerView.addSubview(stackView) stackView.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true stackView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true stackView.widthAnchor.constraint(equalTo: containerView.widthAnchor).isActive = true stackView.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true PlaygroundPage.current.liveView = containerView
добавить
UIStackView
свойстваstackView.alignment = .fill stackView.distribution = .fillProportionally stackView.spacing = 8.0 stackView.axis = .horizontal
вместо добавления метки внутри
UIView
которых не требуется.Если вы используете внутриUITableViewCell
пожалуйста, перезагрузите данные по ротации.
настройка preferredMaxLayoutWidth для UILabel работала для меня
self.myLabel.preferredMaxLayoutWidth = self.bounds.size.width;
iOS 9+
вызов
[textLabel sizeToFit]
после установки текста UILabel.sizeToFit будет перекомпоновать многострочной надписи, используя preferredMaxWidth. Метка размер stackView, которая позволит изменять размер ячейки. Никаких дополнительных ограничений, кроме привязки представления стека к представлению содержимого, не требуется.
волшебный трюк для меня был установить
widthAnchor
доUIStackView
.задание
leadingAnchor
иtrailingAnchor
не будет работать, но установкаcenterXAnchor
иwidthAnchor
сделал отображение UILabel правильно.
в моем случае я следовал предыдущим предложениям, но мой текст все еще усекался до одной строки, хотя только в ландшафте. Оказывается, я нашел невидимку
нулевой символ в тексте метки, который был виновником. Должно быть, он был введен рядом с символом em dash, который я вставил. Чтобы убедиться, что это также происходит в вашем случае, используйте отладчик представления, чтобы выбрать метку и проверить ее текст.
макет системы должен выяснить происхождение, ширину и высоту, чтобы нарисовать его подвиды, в этом случае все ваши подвиды имеют одинаковый приоритет, что точка делает конфликт, система макета не знает зависимостей между представлениями, которые рисуют первый, второй и так далее
Set stack subviews сжатие решит проблему с несколькими линиями, в зависимости от вашего вида стека является горизонтальным или вертикальным и какой из них вы хотите стать несколькими линиями.
stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Xcode 9.2:
просто установите количество строк в 0. Раскадровка будет выглядеть странно после установки этого. Не волнуйтесь, запустите проект. Во время работы Все будет изменяться в соответствии с настройкой раскадровки. Я думаю, что это своего рода ошибка в раскадровке.
советы: установите "количество лайнера в 0" в последнем. сбросьте его, если вы хотите изменить какой-либо другой вид и установить значение 0 после редактирования.