Cocoa Автоопределение: обход содержимого и соответствие степени сжатия содержимого

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

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

Ответ 1

Краткое резюме понятий:

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

Пример:

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

[       Click Me      ]

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

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

[Click Me]

Если приоритет Hugging <500, это будет выглядеть так:

[       Click Me      ]

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

[Click Me]

Иначе, если приоритет сопротивления сжатию <500, он может выглядеть так:

[Cli..]

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

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

Редактор> Размер по размеру содержимого

Ответ 3

enter image description here

источник: @mokagio

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

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

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

Подробнее здесь: AUTO LAYOUT MAGIC: ПРИОРИТЕТЫ РАЗМЕРОВ КОНТЕНТА

Ответ 4

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

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

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

Ответ 5

Если view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, то автомат создает специальное ограничение типа 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, тогда автомат создает 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($0) }

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

Ответ 6

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

Из Документы Apple:

введите описание изображения здесь

Ответ 7

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

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