Cocoa Автоопределение: обход содержимого и соответствие степени сжатия содержимого
Я не могу найти четкий ответ на документацию Apple относительно Cocoa Autolayout о различии между общением содержимого и сопротивлением сжатию.
Может кто-нибудь объяснить свои обычаи и разницу?
Ответы
Ответ 1
Краткое резюме понятий:
- Обниматься => контент не хочет расти
- Сопротивление сжатию => контент не хочет сжиматься
Пример:
Скажем, у вас есть такая кнопка:
[ Click Me ]
и вы прикрепили края к большему суперпредставлению с приоритетом 500.
Тогда, если приоритет Hugging> 500, это будет выглядеть так:
[Click Me]
Если приоритет Hugging <500, это будет выглядеть так:
[ Click Me ]
Если суперпредставление теперь сжимается, если приоритет сопротивления сжатию> 500, это будет выглядеть так
[Click Me]
Иначе, если приоритет сопротивления сжатию <500, он может выглядеть так:
[Cli..]
Если это не работает так, то, возможно, у вас есть другие ограничения, которые портят вашу хорошую работу!
Например, вы можете прикрепить его к суперпредставлению с приоритетом 1000. Или вы можете иметь приоритет ширины. Если это так, это может быть полезно:
Редактор> Размер по размеру содержимого
Ответ 2
Взгляните на это видео учебник об Autolayout, они объясняют это внимательно
Ответ 3
источник: @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
заключается в том, насколько вид "сопротивляется" становится меньше
Вид с более высоким значением приоритета сопротивления - тот, который будет сопротивляться сжатию.