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

Ответ

Приоритет сопротивления сжатию (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) для сопротивления сжатию, что обычно защищает контент от обрезки.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня интересная! Вот сидишь ты, пишешь интерфейс, всё красиво, а потом — бац! — текст не влезает, и система начинает все твои вьюхи как шаурму в лаваш закручивать, сжимать их в пизду.

Так вот, слушай сюда, чтобы этого не было, есть такая штука — приоритет сопротивления сжатию (Compression Resistance Priority). Это, блядь, как рейтинг крутости от 0 до 1000, который говорит системе: «Эй, сука, попробуй меня сожми — получишь по ебалу!».

Суть проблемы, ёпта: Места мало, а контента, как говна за баней, — овердохуища. Длинный текст в UILabel, например. Auto Layout, этот хитрожопый алгоритм, смотрит на эту ситуацию и думает: «Кого бы нам посжимать?». А приоритет сопротивления сжатию ему и подсказывает: «Вот этого пидораса можно, а вот этого — ни-ни».

Как этим пользоваться, не будь мудаком:

  • Высокий приоритет (типа .defaultHigh — 750): Ставь на элемент, который жалко. На важную кнопку «Купить» или заголовок. Это как кричать системе: «Не тронь, блядь, святое!».
  • Низкий приоритет (типа .defaultLow — 250): Вешай на то, что не жалко. На второстепенное описание, которое можно и обрезать многоточием. Типа «ну давай, сожми меня, я не против».

Чисто конкретный пример, чтобы въебать в мозг: Допустим, у тебя два лейбла в горизонтальном стеке. Один — важный заголовок, второй — болтливое описание.

let titleLabel = UILabel()
titleLabel.text = "Скидка 90%! Лови момент!"
// Говорим системе: ЭТО НЕ ТРОГАТЬ ВООБЩЕ. НИКАК. ТРЕБУЕТСЯ.
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, а наш кричащий заголовок останется целым и невредимым. Красота!

И главное, не перепутай с другой хуйнёй:

  • Compression Resistance — это «НЕ СЖИМАЙ МЕНЯ, ПИДОР!». Защищает, чтобы элемент не стал меньше, чем его естественный размер.
  • Content Hugging Priority — это «НЕ РАСТЯГИВАЙ МЕНЯ, УЁБОК!». Защищает, чтобы элемент не стал больше, чем его естественный размер.

По умолчанию у сопротивления сжатию приоритет высокий (750), потому что система предполагает: «Ну нахуй обрезать контент — это не комильфо». Но она, блядь, не знает твоей бизнес-логики, так что думай своей башкой, расставляй приоритеты и не давай системе тебя ебать.