Многострочная метка в 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 после редактирования.



