Что такое Content Compression Resistance Priority в Auto Layout?

Ответ

Content Compression Resistance Priority (приоритет сопротивления сжатию) — это значение (UILayoutPriority), которое определяет, насколько элемент интерфейса (например, UILabel или UIButton) будет сопротивляться уменьшению своего внутреннего размера (intrinsicContentSize) ниже естественного, если в системе Auto Layout возникает нехватка пространства.

Принцип работы: Когда два элемента конкурируют за ограниченное пространство, система сжимает тот элемент, у которого ниже приоритет сопротивления сжатию по соответствующей оси (.horizontal или .vertical).

Практический пример с двумя UILabel:

let longLabel = UILabel()
longLabel.text = "Очень длинный текст метки"
// Высокий приоритет = сопротивляется сжатию
longLabel.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)

let shortLabel = UILabel()
shortLabel.text = "Коротко"
// Низкий приоритет = сожмется первым
shortLabel.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

// При нехватке горизонтального пространства:
// 1. Система попытается сжать shortLabel.
// 2. Если сжатия shortLabel недостаточно, система начнет сжимать longLabel,
//    так как его приоритет тоже ниже обязательного (.required).

Значения приоритета по умолчанию:

  • .required: 1000 (системные констрейнты).
  • .defaultHigh: 750 (стандартный высокий).
  • .defaultLow: 250 (стандартный низкий).

Связь с другими приоритетами: Этот приоритет работает в паре с Content Hugging Priority (приоритет «объятия» контента), который определяет, насколько элемент сопротивляется увеличению своего размера сверх естественного. Вместе они управляют поведением элементов на основе их внутреннего содержания.

Ответ 18+ 🔞

А, слушай, вот эта ваша «Content Compression Resistance Priority» — это же просто пиздец как важно, а многие её, блядь, в упор не видят! Представь себе: два лейбла в одной строке, один с текстом «скидка 99% только сегодня», а второй — «купи слона». И места, сука, на экране — как говна за баней. Кто из них сожмётся в три погибели, а кто останется красавчиком? Вот тут-то эта приоритетность и решает, блядь!

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

Вот тебе живой пример, чтобы мозг не взорвался:

let labelДлинныйКакЖизнь = UILabel()
labelДлинныйКакЖизнь.text = "Акция: купите эту хуйню и получите вторую такую же бесплатно!"
// Ставим высокий приоритет — этот пацан не сожмётся без боя.
labelДлинныйКакЖизнь.setContentCompressionResistancePriority(.defaultHigh, for: .horizontal)

let labelКороткий = UILabel()
labelКороткий.text = "Цена"
// А этому похуй, пусть сжимается первым.
labelКороткий.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)

Что будет? Когда места станет мало, система посмотрит на эти цифры и скажет: «Окей, "Цена" — ты лох с низким приоритетом, давай-ка подожмись». И короткий лейбл схлопнется. А длинный будет стоять, как скала, пока его тоже не прижмут, если места ваще овердохуища мало.

Циферки стандартные, запомни, чтоб не выглядеть мудаком:

  • .required — 1000. Это святое, блядь. Такой элемент сожмётся только если констрейнты вступят в ебическую конфронтацию.
  • .defaultHigh — 750. Ну, в общем, высоковат.
  • .defaultLow — 250. Ну, понятное дело, низковат.

И главное, не путай эту штуку с её сестрой-близняшкой — Content Hugging Priority. Та отвечает за то, чтобы элемент не распухал, как жопа после праздников, а эта — чтобы его не сжали, как твоё достоинство в холодной воде. Работают они в тандеме, управляя этим цирком с контентом. Вот и вся магия, ёпта!