Какао Autolayout: содержание обнимать против приоритет сопротивления сжатия контента
Я не могу найти четкого ответа на документацию Apple, касающуюся автоматического воспроизведения Cocoa о разнице между обниманием контента и сопротивлением сжатию.
может кто-нибудь объяснить их обычаи и разницу ?
7 ответов
краткое изложение понятий:
- обниматься = > содержание не хочет расти
- сопротивление сжатию = > содержимое не хочет сжиматься
и пример:
скажем, у вас есть такая кнопка:
[ Click Me ]
и вы прикрепили края к большему супервизору с приоритетом 500.
тогда, если обнимать приоритет > 500 это будет выглядеть так:
[Click Me]
если обнимать приоритет
[ Click Me ]
если superview теперь сжимается, то, если приоритет сопротивления сжатию > 500, это будет выглядеть так
[Click Me]
иначе, если приоритет сопротивления сжатию
[Cli..]
если это не работает так, то у вас, вероятно, есть некоторые другие ограничения, которые мешают вашей хорошей работе!
Е. Г. вы могли бы его прижали к суперпанель с приоритетом 1000. Или ты мог бы ... приоритет ширины. Если это так, это может быть полезно:
"редактор" > размер, чтобы соответствовать содержание
взгляните на это видео учебник по Autolayout, они объясняют это тщательно
источник: @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:
на Content hugging priority
как резинка это помещается вокруг представления.
Чем выше значение приоритета, тем сильнее резиновая лента и тем больше она хочет обнять свой размер содержимого.
Значение приоритета можно представить как "прочность" резинки
и Content Compression Resistance
есть, сколько вид "сопротивляется" становится все меньше
Представление с более высоким значением приоритета сопротивления это будет сопротивляться сжатию.