Swift iOS - setContentHuggingPriority устанавливает приоритет для неправильной метки - PullRequest
0 голосов
/ 06 июня 2019

У меня есть ячейка с 4 метками:

2 отдельные статические метки и 2 отдельные динамические метки. Текст в 2 статических метках всегда говорит Квитанция # , а другой - Дата квитанции .

Способ, которым я его настроил, заключается в том, что у обоих статических меток есть ведущие якоря, прикрепленные к ведущему якорю contentView ячейки. Для обоих setContentHuggingPriority установлено значение High, а для setContentCompressionResistancePriority установлено значение Low. Их нижние якоря прикреплены к каждой из соответствующих им динамических меток lastBaseLineAnchor

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

Ведущий-якорк квитанции-номера-метки прикреплен к ведущему-якору квитанции-даты-метки.

Ведущий Якорь квитанции DateLabel закреплена на расстоянии 10 пунктов от staticReceiptDateLabel. Этот ярлык должен быть гибким, но это не так. Так как ведущий-якорк receiveNumberLabels следует за этим, он также смещен.

enter image description here

Как видите, staticReceiptDateLabel длиннее, но оно должно быть короче, а receiveDateLabel должно быть длиннее. Я пробовал разные комбинации для значений setContentHuggingPriority и setContentCompressionResistancePriority, но независимо от того, что я продолжаю получать эти результаты, как я могу это исправить?

contentView.addSubview(receiptNumberLabel) // dynamic
contentView.addSubview(staticReceiptNumberLabel)
contentView.addSubview(receiptDateLabel) // dynamic
contentView.addSubview(staticReceiptDateLabel)

receiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: receiptDateLabel.leadingAnchor, constant: 0).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptNumberLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
receiptNumberLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)

staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.lastBaselineAnchor.constraint(equalTo: receiptNumberLabel.lastBaselineAnchor).isActive = true
staticReceiptNumberLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
staticReceiptNumberLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

receiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor, constant: 10).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptDateLabel.setContentHuggingPriority(UILayoutPriority.defaultLow, for: .horizontal)
receiptDateLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)

staticReceiptDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptDateLabel.lastBaselineAnchor.constraint(equalTo: receiptDateLabel.lastBaselineAnchor).isActive = true
staticReceiptDateLabel.setContentHuggingPriority(UILayoutPriority.defaultHigh, for: .horizontal)
staticReceiptDateLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

UPDATE

В комментариях @bsod предложил вообще не использовать объятия / сжатия. Я изначально не использовал их, и возникла та же проблема, я переключился на них в качестве крайней меры. Вот код без объятий / сжатия.

receiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: receiptDateLabel.leadingAnchor, constant: 0).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true

staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.lastBaselineAnchor.constraint(equalTo: receiptNumberLabel.lastBaselineAnchor).isActive = true

receiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor, constant: 10).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true

staticReceiptDateLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptDateLabel.lastBaselineAnchor.constraint(equalTo: receiptDateLabel.lastBaselineAnchor).isActive = true

1 Ответ

0 голосов
/ 06 июня 2019

Забудьте обнимающий / сжимающий API и используйте его как отправную точку.Начните с верхнего левого ярлыка и двигайтесь вниз слева направо, сверху вниз.Обратите внимание, что верхний якорь метки статической даты прикрепляется к нижней части метки значения номера квитанции, если она имеет более одной строки.

staticReceiptNumberLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
staticReceiptNumberLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 10).isActive = true

receiptNumberLabel.topAnchor.constraint(equalTo: staticReceiptNumberLabel.topAnchor).isActive = true
receiptNumberLabel.leadingAnchor.constraint(equalTo: staticReceiptNumberLabel.trailing, constant: 10).isActive = true
receiptNumberLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true

staticReceiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptNumberLabel.leadingAnchor).isActive = true
staticReceiptDateLabel.topAnchor.constraint(equalTo: receiptNumberLabel.bottomAnchor).isActive = true

receiptDateLabel.topAnchor.constraint(equalTo: staticReceiptDateLabel.topAnchor).isActive = true
receiptDateLabel.leadingAnchor.constraint(equalTo: staticReceiptDateLabel.trailingAnchor, constant: 10).isActive = true
receiptDateLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
receiptDateLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -10).isActive = true

Возможно, вам также потребуется явно установить метки заголовка 'numberOfLines до 1, иначе UIKit может обрезать метку значения, даже если его numberOfLines равно 0.

Если по какой-либо причине вы даже не хотите, чтобы статические метки увеличивались в размере, возможно, потому что вы их далицвет фона, затем вы можете ввести API объятия / сжатия.Если это так, статические метки будут:

theStaticLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
theStaticLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)

, а динамические метки будут:

theDynamicLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
theDynamicLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
...