Многострочная метка в UIStackView


при помещении многострочной метки (с linebreak, установленным в word Wrap) в представление стека, метка немедленно теряет linebreak и отображает текст метки в одной строке вместо этого.

Почему это происходит и как сохранить многострочных меток в виде стека?

13 75

13 ответов:

  1. вставить UILabel внутри UIView (Редактор - > Вставить - > Вид)
  2. используйте ограничения, чтобы соответствовать UILabel до UIView (например, конечное пространство, верхнее пространство и ведущее пространство для ограничений супервизора)

The UIStackView будет растянуть UIView чтобы соответствовать должным образом, и UIView будет сдерживать UILabel на несколько строк.

  • Сначала установите количество строк метки в 0
  • вид стека по-прежнему не будет расти до multiLine Если вы даете ему фиксированную ширину. Когда мы фиксируем его ширину, то он разбивается на несколько строк, когда эта ширина достигается, как показано:

screen recording

если мы не даем фиксированную ширину для представления стека, потом все становится неоднозначным. Как долго будет расти представление стека с меткой (если значение метки динамическое)?

надеюсь, что это может исправить вашу проблему.

для горизонтального вида стека, который имеет UILabel в качестве одного из своих взглядов, в интерфейсе строителя, во-первых, установить label.numberOfLines = 0. Это должно привести к этикетке, чтобы иметь больше чем 1 линию. Это изначально не сработало для меня, когда представление стека было label.alignment = .fill. Чтобы заставить его работать, просто установите label.alignment = .center. Теперь метка может расширяться до нескольких строк внутри UIStackView.

The документация Apple говорит

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

обратите внимание на слово за исключением здесь. Когда .fill используется горизонтальная UIStackView не изменяет размер по вертикали, используя размеры расположенных подвидов.

просто установите количество строк в 0 в инспекторе атрибутов для метки. Это будет работать на вас.

enter image description here

ниже приведена игровая площадка реализации многострочной метки с разрывом строки внутри 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. Раскадровка будет выглядеть странно после установки этого. Не волнуйтесь, запустите проект. Во время работы Все будет изменяться в соответствии с настройкой раскадровки. Я думаю, что это своего рода ошибка в раскадровке. enter image description here

советы: установите "количество лайнера в 0" в последнем. сбросьте его, если вы хотите изменить какой-либо другой вид и установить значение 0 после редактирования.

enter image description here

Что сработало для меня!

stackview: выравнивание: заливка, распределение: заливка, ограничение пропорциональной ширины для superview ex. 0.8,

метка: центр и линии = 0