У меня возникли проблемы с получением контента, работающего в пользовательском представлении. У меня есть следующий код:
pillView.setContentHuggingPriority(.required, for: .horizontal)
pillView.setContentCompressionResistancePriority(.required, for: .horizontal)
dateLabel.setContentHuggingPriority(.defaultLow, for: .horizontal)
dateLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
Я добавляю эти два представления в представление стека:
let dateStackView = UIStackView(arrangedSubviews: [pillView, dateLabel])
Результат такой:
Представление LIVE NOW должно охватывать его содержимое. Он определяется так:
final class PillView: UIView {
private enum Constants {
static let radius: CGFloat = 4.0
static let labelInsets = UIEdgeInsets(horizontal: 8.0, vertical: 4.0)
}
enum Config {
case attention
var font: UIFont {
switch self {
case .attention: return Font.caption
}
}
var textColor: UIColor {
switch self {
case .attention: return .white
}
}
var backgroundColor: UIColor {
switch self {
case .attention: return Theme.red100
}
}
}
// MARK: - Properties
private let config: Config
// MARK: - Initializers
init(text: String, config: Config = .attention) {
self.config = config
super.init(frame: .zero)
backgroundColor = config.backgroundColor
clipsToBounds = true
layer.cornerRadius = Constants.radius
let label = UILabel()
label.font = config.font
label.textColor = config.textColor
label.text = text
addSubview(label)
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.topAnchor.constraint(equalTo: topAnchor, constant: Constants.labelInsets.top),
label.bottomAnchor.constraint(equalTo: bottomAnchor, constant: -Constants.labelInsets.bottom),
label.leadingAnchor.constraint(equalTo: leadingAnchor, constant: Constants.labelInsets.left),
label.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -Constants.labelInsets.right)
])
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Не уверен, почему он не будет охватывать содержимое при просмотре стека. Есть идеи? Был бы очень признателен за некоторые указания по этому поводу. Спасибо!
Извините, это было расширение для добавления ограничений. Я обновил вопрос.
По какой-то причине я не могу воспроизвести это поведение ... Красная метка обнимает свое содержимое, как и ожидалось для меня.
@Sweeper, не могли бы вы поделиться своим кодом?
Спасибо. Да, его тоже не нужно сжимать. Проблема заключалась в том, что метка внутри PillView
должна иметь установленный приоритет сжатия и сжатия, тогда она работает.
Проверьте свойство дистрибутива для просмотра стека.
Это не должно быть fillEqually
, поскольку оно будет игнорировать конфигурацию другого представления.
Отметьте его значение fill
Обновлено:
FillProportionally получить мне результат как:
Это fill
. fill
по умолчанию.
@Kex попробуйте один раз с fillProportionally
Это не обнимает первую этикетку
@Kex, можете ли вы попробовать сделать конечное ограничение просмотра стека больше, чем равно, а не euqal? что позволит сжимать или расширять стек в соответствии с содержимым?
Добавьте эти строки в свою функцию PillView
init(...)
:
label.setContentHuggingPriority(.required, for: .horizontal)
label.setContentCompressionResistancePriority(.required, for: .horizontal)
Тогда вам не нужно устанавливать ни одно из этих свойств для экземпляров pillView
или dateLabel
.
попробовал это для iOS 14 и выше, что дало ожидаемые результаты.
Что делает
pin(to:insets:)
? Можете ли вы показать его декларацию?