Swift - автоматическая разметка высоты UILabel на основе его содержимого - PullRequest
0 голосов
/ 11 января 2020

У меня проблемы с настройкой автоматического макета для UILabel, и я хотел бы получить помощь по этому вопросу.

enter image description here

На картинке я создал желтый и зеленый UILabels.

То, чего я хочу добиться, - это динамически регулировать высоту желтого UILabel на основе количества строк в его содержимом и привязать верхнюю часть зеленого поля к закреплению нижней части желтого поля.

В настоящее время у меня есть следующий код:

// Yellow UILabel
addSubview(captionLabel)
captionLabel.anchor(top: actionButtonsStackView.bottomAnchor, left: leadingAnchor, bottom: nil, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)
captionLabel.heightAnchor.constraint(greaterThanOrEqualToConstant: 0).isActive = true

// Green UILabel
addSubview(dateLabel)
dateLabel.anchor(top: captionLabel.bottomAnchor, left: leadingAnchor, bottom: bottomAnchor, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)

Примечание: функция привязки устанавливает верхние, ведущие, нижние и конечные ограничения с соответствующими дополнениями.

Как видите, желтая UILabel занимает больше места, чем нужно на самом деле.

Если я оставлю верхнее ограничение из зеленой UILabel, желтая рамка действительно начнет работать так, как я ожидаю:

enter image description here

И код для этого выглядит следующим образом:

// Yellow UILabel
addSubview(captionLabel)
captionLabel.anchor(top: actionButtonsStackView.bottomAnchor, left: leadingAnchor, bottom: nil, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)
captionLabel.heightAnchor.constraint(greaterThanOrEqualToConstant: 0).isActive = true

// Green UILabel
addSubview(dateLabel)
dateLabel.anchor(top: nil, left: leadingAnchor, bottom: bottomAnchor, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)

Что я здесь не так делаю?


На самом деле, удаление bottomAnchor из зеленого поля заставляет его работать: enter image description here

И код для этого выглядит так:

// Yellow UILabel
addSubview(captionLabel)
captionLabel.anchor(top: actionButtonsStackView.bottomAnchor, left: leadingAnchor, bottom: nil, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)
captionLabel.heightAnchor.constraint(greaterThanOrEqualToConstant: 0).isActive = true

// Green UILabel
addSubview(dateLabel)
dateLabel.anchor(top: captionLabel.bottomAnchor, left: leadingAnchor, bottom: nil, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)

Но почему он работает? Я подумал, установив константу greatThenOrEqual, саму желтую UILabel автоматически увеличивать размер до размера, достаточного для его содержимого, а зеленую UILabel корректировать его размер в соответствии с желтой UILabel bottomAnchor.

1 Ответ

0 голосов
/ 11 января 2020

Это потому, что вы добавляете две метки с одинаковым приоритетом вертикального объятия контента (low по умолчанию). Если вы хотите, чтобы зеленая метка стала выше, вы можете установить значение Content Hugging Priority для красной на high или required. Вот код:

// Yellow UILabel
addSubview(captionLabel)
captionLabel.setContentHuggingPriority(.defaultHigh, for: .vertical)
captionLabel.anchor(top: actionButtonsStackView.bottomAnchor, left: leadingAnchor, bottom: nil, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)

// Green UILabel
addSubview(dateLabel)
dateLabel.anchor(top: captionLabel.bottomAnchor, left: leadingAnchor, bottom: bottomAnchor, right: trailingAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)

Для более подробной информации вы можете эту статью: https://medium.com/@abhimuralidharan / ios -content-обнимания и-содержимого-сопротивление-приоритеты-приоритеты-476fb5828ef

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...