Эти два свойства играют ключевую роль в AutoLayout, определяя, как элементы интерфейса ведут себя при изменении доступного пространства.
Определение: Сопротивление растяжению элемента сверх его естественного размера (intrinsic content size).
Как работает:
let label = UILabel()
label.setContentHuggingPriority(.defaultHigh, for: .horizontal)
// Приоритеты по умолчанию:
// .horizontal: 251
// .vertical: 251
Определение: Сопротивление уменьшению размера элемента ниже его естественного размера.
Как работает:
label.setContentCompressionResistancePriority(.required, for: .vertical)
// Приоритеты по умолчанию:
// .horizontal: 750
// .vertical: 750
Рассмотрим ситуацию с двумя лейблами в горизонтальном стеке:
let titleLabel = UILabel()
titleLabel.text = "Важное название"
let valueLabel = UILabel()
valueLabel.text = "Значение"
// Настраиваем приоритеты
titleLabel.setContentHuggingPriority(.defaultHigh, for: .horizontal)
valueLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
let stack = UIStackView(arrangedSubviews: [titleLabel, valueLabel])
stack.axis = .horizontal
В этом случае:
titleLabel
будет стремиться сохранить свою ширинуvalueLabel
будет растягиваться при наличии свободного местаvalueLabel
будет обрезан последнимПриоритет | Значение | Описание |
---|---|---|
.required | 1000 | Максимальный |
.defaultHigh | 750 | Высокий |
.defaultLow | 250 | Низкий |
.fittingSizeLevel | 50 | Для автоматического подбора размера |
Для текстовых элементов:
Для декоративных элементов:
В сложных layout:
Если элементы ведут себя неожиданно:
po label.value(forKey: "_horizontalHuggingPriority")
po label.value(forKey: "_verticalCompressionResistancePriority")
contentHuggingPriority:
contentCompressionResistancePriority:
Используйте эти свойства для: