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 ?
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
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
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
Ź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
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.
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.
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>
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 :
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ę.
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