Что такое приоритет сопротивления сжатию (compression resistance) в Auto Layout?

«Что такое приоритет сопротивления сжатию (compression resistance) в Auto Layout?» — вопрос из категории UIKit, который задают на 22% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Приоритет сопротивления сжатию (Compression Resistance Priority) — это значение (от 0 до 1000), которое определяет, насколько сильно элемент интерфейса (view) сопротивляется попытке системы сжать его размер меньше его внутреннего (intrinsic) размера.

Контекст и проблема: Когда контента больше, чем доступного пространства (например, длинный текст в UILabel внутри узкой ячейки), Auto Layout пытается сжать view. Приоритет сопротивления сжатию указывает, какое view будет сжато в первую очередь.

Как использовать:

  • Высокий приоритет (например, .defaultHigh - 750): View будет активно сопротивляться сжатию. Установите для элемента, чей контент важен (например, важная кнопка или заголовок).
  • Низкий приоритет (например, .defaultLow - 250): View легче сжать. Установите для элементов, которые могут быть обрезаны (например, второстепенный текст).

Практический пример с двумя лейблами в горизонтальном стеке:

let titleLabel = UILabel()
titleLabel.text = "Важный заголовок"
titleLabel.setContentCompressionResistancePriority(.required, for: .horizontal) // Не сжимать!

let detailsLabel = UILabel()
detailsLabel.text = "Дополнительное описание, которое может быть длинным"
detailsLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) // Можно сжать

let stack = UIStackView(arrangedSubviews: [titleLabel, detailsLabel])
stack.axis = .horizontal
stack.distribution = .fill
// При нехватке места detailsLabel будет обрезан (...), а titleLabel останется целым.

Связь с Content Hugging Priority:

  • Compression Resistance («не сжимай меня») — защищает от уменьшения меньше внутреннего размера.
  • Content Hugging Priority («не растягивай меня») — защищает от увеличения больше внутреннего размера.

Значение по умолчанию: .defaultHigh (750) для сопротивления сжатию, что обычно защищает контент от обрезки.