2015-11-21 6 views
5

Próbuję zrozumieć, jak naprawdę działa opór przy ściskaniu i ściskaniu.Przytulność i odporność na ściskanie w zagnieżdżonych widokach

Mam ten scenariusz, w którym potrzebuję dwóch etykiet po lewej (wewnątrz zielonego pojemnika) i dwóch etykiet po prawej (wewnątrz niebieskiego pojemnika).

enter image description here

Jak widać na zdjęciach, chcę zielony pojemnik przytulić treści (Android wrap content) i niebieski pojemnik wypełnić pozostałą przestrzeń (Android fill_parent).

Myślałem, że mogę tylko dodać priorytety przytulanie/kompresja na zielonym świetle, jak:

greenView.setContentHuggingPriority(
    UILayoutPriorityDefaultHigh, forAxis: .Horizontal) 
greenView.setContentCompressionResistancePriority(
    UILayoutPriorityDefaultHigh, forAxis: .Horizontal) 

Ale wydaje się, że to nie działa zgodnie z oczekiwaniami. Muszę zastosować te więzy na etykietach (czerwonej i żółtej).

Ktoś zna przyczynę?

Niektóre myśli (red):

Od odpowiedź Kena wynika, że ​​trzeba ustawić przytulanie/kompresję do etykiet zamiast poglądów kontenerowych.

W przykładzie tego pytania ustawilabym na przykład przyleganie 750 (Wysokie) i opór 1000 (Wymagany) na etykietach po lewej stronie. Ponieważ wartości domyślne dla etykiet to przytulanie 251 (niski + 1) i opór 750 (wysoki), przytulanie i kompresja będą większe dla etykiet po lewej stronie (750> 251 i 1000> 750). W tym samym czasie kompresja będzie większa niż przyleganie do samych etykiet (1000> 750).

W ten sposób etykiety po lewej będą próbowały uścisnąć treść, ale nie tak, aby ją skompresować. Na przykład czerwona etykieta nie może całkowicie zawinąć zawartości, ponieważ żółta etykieta nie chce kompresować.

Uff!

Odpowiedz

13

Priorytety dopasowania i odporności na kompresję mają znaczenie jedynie w stosunku do rzeczywistego rozmiaru zawartości widoku. Zasadniczo, jeśli widok ma szerokość wewnętrzną treść, system automatycznej układ traktuje go tak, jakby był z zastrzeżeniem następujących ograniczeń:

[view(<[email protected])] 
[view(>[email protected])] 

to wszystkie te myśli. To samo dotyczy oczywiście samej wysokości wewnętrznej.

Zwykły UIView używany jako pojemnik nie ma wewnętrznego rozmiaru. Tak więc priorytety dotyczące przyswajania treści i priorytetów kompresji są bez znaczenia.

+0

Świetne wyjaśnienie, Ken. Nie widziałem nigdzie takiego wyjaśnienia, i to ma całkiem sens. Czy jest jakiś oficjalny dokument, w którym to jest potwierdzone? –

+0

Teraz widzę, że właśnie to [oficjalna dokumentacja] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/setContentHuggingPriority:forAxis :) mówi. Ale teraz to rozumiem. Dzięki! –

+1

Cieszę się, że mogłem pomóc. Zamiast konsultować się z odnośnikiem do klasy, możesz znaleźć [przewodnik konceptualny] (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AnatomyofaConstraint.html#//apple_ref/doc/uid/ TP40010853-CH9-SW21) bardziej pomocne. –