Cocoa Autolayout: content hugging vs content compression resistance priority

Nie mogę znaleźć jasnej odpowiedzi w dokumentacji Apple dotyczącej Cocoa Autolayout na temat różnicy między zawartością a odpornością na kompresję.

Czy ktoś może wyjaśnić ich zwyczaje i różnice ?

Author: David James, 2013-04-06

7 answers

Krótkie podsumowanie pojęć:

  • przytulanie = >treść nie chce rosnąć
  • odporność na ściskanie = > zawartość nie chce się kurczyć

I przykład:

Powiedz, że masz taki guzik:

[       Click Me      ]

I przypiąłeś krawędzie do większego superview z priorytetem 500.

Wtedy, jeśli priorytet > 500 będzie wyglądał tak:

[Click Me]

Jeśli priorytet

[       Click Me      ]

Jeśli teraz kurczy się wtedy, jeśli priorytet odporności na ściskanie > 500, będzie wyglądał tak

[Click Me]

W przeciwnym razie, Jeśli priorytet odporności na ściskanie

[Cli..]

Jeśli to nie działa w ten sposób, to prawdopodobnie masz inne ograniczenia, które psują twoją dobrą pracę!

Np. można go przypiąć do superview z priorytetem 1000. Albo możesz mieć priorytet szerokości. Jeśli tak, to może być pomocne:

Edytor > Rozmiar do dopasowania Content

 1214
Author: Snowcrash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-26 10:44:42

Spójrz na ten film tutorial o Autolayout , wyjaśniają to dokładnie

Tutaj wpisz opis obrazka

 270
Author: onmyway133,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-21 18:23:30

Tutaj wpisz opis obrazka

Źródło: @ mokagio

Wewnętrzny rozmiar zawartości - dość oczywiste, ale widoki ze zmienną zawartością są świadome tego, jak duża jest ich zawartość i opisują rozmiar ich zawartości za pomocą tej właściwości. Niektóre oczywiste przykłady widoków, które mają wewnętrzne rozmiary zawartości to UIImageViews, Uilabels, UIButtons.

Priorytet content - im wyższy jest ten priorytet, tym bardziej obraz jest większy niż jego wewnętrzna wielkość treści.

Content Compression Resistance Priority - im wyższy jest ten priorytet, tym bardziej widok jest odporny na kurczenie się mniejsze niż jego wewnętrzny rozmiar zawartości.

Sprawdź tutaj, aby uzyskać więcej wyjaśnień: Auto Layout MAGIC: content SIZING PRIORITIES

 105
Author: Balasubramanian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 07:13:52

Powiedzmy, że masz przycisk z tekstem "Kliknij mnie". Jaką szerokość powinien mieć ten przycisk?

Po pierwsze, zdecydowanie nie chcesz, aby przycisk był mniejszy niż tekst. W przeciwnym razie tekst zostanie obcięty. Jest to priorytet poziomej odporności na ściskanie.

Po drugie, nie chcesz, aby przycisk był większy niż powinien być. Przycisk, który wyglądał tak, [Kliknij mnie], jest oczywiście zbyt duży. Chcesz, aby przycisk "przytulił" jego zawartość bez zbytniego wyściółka. Jest to priorytet poziomego Przytulania treści. W przypadku przycisku nie jest tak silny, jak priorytet odporności na ściskanie w poziomie.

 36
Author: Bridgeyman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-07 17:13:26

Jeśli view.intrinsicContentSize.width != NSViewNoIntrinsicMetric, to auto layout tworzy specjalne ograniczenie typu NSContentSizeLayoutConstraint. Ograniczenie to działa jak dwa normalne ograniczenia:

  • ograniczenie wymagające view.width <= view.intrinsicContentSize.width z priorytetem poziomym i
  • ograniczenie wymagające view.width >= view.intrinsicContentSize.width z priorytetem poziomej odporności na ściskanie.
W języku Swift, z nowymi kotwicami układu iOS 9, można skonfigurować równoważne ograniczenia, takie jak:]}
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)

Podobnie, Jeśli view.intrinsicContentSize.height != NSViewNoIntrinsicMetric, to auto layout tworzy NSContentSizeLayoutConstraint, który działa jak dwa ograniczenia wysokości widoku. W kodzie wyglądałyby tak:

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)

Możesz zobaczyć te specjalne instancje NSContentSizeLayoutConstraint (jeśli istnieją), drukując view.constraints po uruchomieniu układu. Przykład:

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>
 17
Author: rob mayoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-08 15:10:38

Content Hugging i Content Compression resistance priorytety pracy dla elementów, które mogą obliczyć ich rozmiar w zależności od zawartości, które wchodzą.

From Apple docs :

Tutaj wpisz opis obrazka

 14
Author: dev gr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-09 09:16:23

The Content hugging priority jest jak Opaska Gumowa to jest umieszczone wokół widoku. Im wyższa wartość priorytetu, tym mocniejsza gumka i tym bardziej chce przytulić się do swojej zawartości. Wartość priorytetu można sobie wyobrazić jako "wytrzymałość" gumki

I Content Compression Resistance jest, Ile a widok "opór" coraz mniejszy Widok o wyższej wartości priorytetu rezystancji jest taki, który będzie odporny na kompresję.

 8
Author: Naishta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-21 06:04:32