Для чего в UIKit используется свойство contentCompressionResistancePriority?

Ответ

contentCompressionResistancePriority определяет приоритет, с которым представление (view) сопротивляется сжатию своего размера ниже его intrinsicContentSize.

Зачем это нужно? В Auto Layout при нехватке пространства система должна решить, какое из представлений сжать. Свойство задает «силу сопротивления» сжатию по горизонтальной (.horizontal) или вертикальной (.vertical) оси.

Практический пример: Два лейбла (label1, label2) расположены в одной строке, и их суммарная ширина превышает ширину супервью.

// label1 важнее, его текст должен быть виден полностью.
label1.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
// label2 может быть обрезан или сжат.
label2.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

В этой ситуации система сожмет (обрежет) label2, так как его приоритет сопротивления сжатию ниже.

Ключевые моменты:

  • Приоритеты: Задаются через UILayoutPriority в диапазоне от 1 до 1000. Стандартные значения: .required (1000), .defaultHigh (750), .defaultLow (250).
  • Значение по умолчанию: .defaultHigh (750) для всех осей.
  • Антагонист: contentHuggingPriority — приоритет сопротивления РАСТЯЖЕНИЮ сверх intrinsicContentSize.

Ответ 18+ 🔞

А, слушай, смотри, вот эта штука contentCompressionResistancePriority — это, по сути, её крик души, когда системе не хватает места и она начинает всех давить.

Представь: стоят два лейбла в ряд, как два мужика в тесном лифте. Система смотрит и думает: «Ну всё, пиздец, не влезаете. Кого прижать к стенке?». Вот этот самый приоритет — это как внутренний стержень, насколько лейбл готов упираться локтями и орать «Не уйду, блядь, я важный!».

Короче, это сила, с которой вьюха сопротивляется, чтобы её не сжали меньше её естественного размера (intrinsicContentSize).

Пример из жизни, чтобы не ебнуться: Допустим, у тебя цена и название товара в строке. Цена должна быть всегда видна полностью, а название — ну, обрежется, и хуй с ним.

// Цена — важная пизда, её не трогать.
priceLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)
// Название — потерпит, пусть его сжимают.
nameLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

Когда места станет мало, система посмотрит на эти приоритеты, поймёт, что nameLabel — тряпка, и начнёт его укорачивать, пока цена стоит как скала. Ёпта, логично же?

Что надо запомнить, чтобы не быть мудаком:

  • Циферки: Приоритеты от 1 до 1000. Есть готовые: .required (1000 — «вообще не трогай, а то в ебло получишь»), .defaultHigh (750), .defaultLow (250).
  • По дефолту у всех стоит .defaultHigh (750) — то есть все изначально немного упёртые.
  • Не путай с другой хуйнёй: Есть ещё contentHuggingPriority — это наоборот, сопротивление растягиванию. Одна штука не даёт сжать, другая — не даёт раздуть. В общем, полный контроль над жопой вьюхи.

Вот и вся магия. Выставляешь приоритеты — и система сама решает, кого сломать в первую очередь, когда начинается давка. Удобно, блядь.