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