Какао Autolayout: содержание обнимать против приоритет сопротивления сжатия контента

Я не могу найти четкого ответа на документацию Apple, касающуюся автоматического воспроизведения Cocoa о разнице между обниманием контента и сопротивлением сжатию.

может кто-нибудь объяснить их обычаи и разницу ?

7 ответов


краткое изложение понятий:

  • обниматься = > содержание не хочет расти
  • сопротивление сжатию = > содержимое не хочет сжиматься

и пример:

скажем, у вас есть такая кнопка:

[       Click Me      ]

и вы прикрепили края к большему супервизору с приоритетом 500.

тогда, если обнимать приоритет > 500 это будет выглядеть так:

[Click Me]

если обнимать приоритет

[       Click Me      ]

если superview теперь сжимается, то, если приоритет сопротивления сжатию > 500, это будет выглядеть так

[Click Me]

иначе, если приоритет сопротивления сжатию

[Cli..]

если это не работает так, то у вас, вероятно, есть некоторые другие ограничения, которые мешают вашей хорошей работе!

Е. Г. вы могли бы его прижали к суперпанель с приоритетом 1000. Или ты мог бы ... приоритет ширины. Если это так, это может быть полезно:

"редактор" > размер, чтобы соответствовать содержание


взгляните на это видео учебник по Autolayout, они объясняют это тщательно

enter image description here


enter image description here

источник: @mokagio

Внутренний Размер Содержимого - довольно понятно, но представления с переменным контентом знают, насколько велик их контент, и описывают размер своего контента через это свойство. Некоторые очевидные примеры представлений, имеющих внутренние размеры содержимого, - UIImageViews, UILabels, UIButtons.

Содержание Обнимая Приоритет - чем выше приоритет, тем более представление сопротивляется росту больше, чем его внутренний размер контента.

Приоритет Сопротивления Сжатию Содержимого - чем выше этот приоритет, тем больше представление сопротивляется сокращению меньше, чем его внутренний размер контента.

проверьте здесь для получения дополнительных объяснений:AUTO LAYOUT MAGIC: ПРИОРИТЕТЫ РАЗМЕРОВ КОНТЕНТА


допустим, у вас есть кнопка с текстом "Click Me". Какой ширины должна быть эта кнопка?

во-первых, вы определенно не хотите, чтобы кнопка была меньше текста. В противном случае текст будет обрезан. Это приоритет сопротивления горизонтальному сжатию.

во-вторых, вы не хотите, чтобы кнопка была больше, чем нужно. Кнопка, которая выглядела так, [ Нажмите меня], очевидно, слишком велика. Вы хотите, чтобы кнопка "обнять" его содержимое без обивки. Это приоритет горизонтального обнимания контента. Для кнопки он не так силен, как приоритет сопротивления горизонтальному сжатию.


если view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, затем auto layout создает специальное ограничение типа NSContentSizeLayoutConstraint. Это ограничение действует как два нормальным ограничениям:

  • ограничения, требующие view.width <= view.intrinsicContentSize.width с горизонтальным приоритетом объятий и
  • ограничения, требующие view.width >= view.intrinsicContentSize.width с горизонтальным приоритетом сопротивления обжатия.

в Swift, с новыми якорями макета iOS 9, вы можете настроить эквивалентные ограничения, такие как это:

let horizontalHugging = view.widthAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalHugging.priority = view.contentHuggingPriority(for: .horizontal)

let horizontalCompression = view.widthAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.width)
horizontalCompression.priority = view.contentCompressionResistancePriority(for: .horizontal)

аналогично, если view.intrinsicContentSize.height != NSViewNoIntrinsicMetric, затем auto layout создает NSContentSizeLayoutConstraint, который действует как два ограничения на высоту представления. В коде, они будут выглядеть так:

let verticalHugging = view.heightAnchor.constraint(
    lessThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalHugging.priority = view.contentHuggingPriority(for: .vertical)

let verticalCompression = view.heightAnchor.constraint(
    greaterThanOrEqualToConstant: view.intrinsicContentSize.height)
verticalCompression.priority = view.contentCompressionResistancePriority(for: .vertical)

вы можете увидеть эти специальные NSContentSizeLayoutConstraint экземпляры (если они существуют) по печати view.constraints после запуска макета. Пример:

label.constraints.forEach { print() }

// Output:
<NSContentSizeLayoutConstraint:0x7fd82982af90 H:[UILabel:0x7fd82980e5e0'Hello'(39)] Hug:250 CompressionResistance:750>
<NSContentSizeLayoutConstraint:0x7fd82982b4f0 V:[UILabel:0x7fd82980e5e0'Hello'(21)] Hug:250 CompressionResistance:750>

приоритеты сопротивления сжатию контента и сжатию контента работают для элементов, которые могут рассчитать их размер в зависимости от содержимого, которое входит.

с Apple docs:

enter image description here


на Content hugging priority как резинка это помещается вокруг представления. Чем выше значение приоритета, тем сильнее резиновая лента и тем больше она хочет обнять свой размер содержимого. Значение приоритета можно представить как "прочность" резинки

и Content Compression Resistance есть, сколько вид "сопротивляется" становится все меньше Представление с более высоким значением приоритета сопротивления это будет сопротивляться сжатию.