2015-10-07 17 views
37

Mam prosty poziomy UIStackView z kilkoma UIViews ułożone w stos. Moim celem jest stworzenie zmiennego odstępu między widokami. Doskonale zdaję sobie sprawę z tego, że mogę tworzyć stałą przestrzeń między subspekcjami za pomocą właściwości "spacing". Jednak moim celem jest stworzenie zmiennej przestrzeni. Proszę zwrócić uwagę, jeśli to w ogóle możliwe, chciałbym unikać używania niewidocznych widoków, które działają jako elementy dystansowe.Jak utworzyć UIStackView ze zmiennymi odstępami między widokami?

Najlepsze, co wymyśliłem, to zawrzeć moje UIViews w oddzielnym UIStackView i użyć layoutMarginsRelativeArrangement = YES, aby uszanować marginesy układu mojego wewnętrznego stosu. Miałem nadzieję, że mogę zrobić coś podobnego z dowolnym UIView bez uciekania się do tego brzydkiego obejścia. Oto mój przykładowy kod:

// Create stack view 
UIStackView *stackView = [[UIStackView alloc] init]; 
stackView.translatesAutoresizingMaskIntoConstraints = NO; 
stackView.axis = UILayoutConstraintAxisHorizontal; 
stackView.alignment = UIStackViewAlignmentCenter; 
stackView.layoutMarginsRelativeArrangement = YES; 

// Create subview 
UIView *view1 = [[UIView alloc] init]; 
view1.translatesAutoresizingMaskIntoConstraints = NO; 
// ... Add Auto Layout constraints for height/width 
// ... 
// I was hoping the layoutMargins would be respected, but they are not 
view1.layoutMargins = UIEdgeInsetsMake(0, 25, 0, 0); 

// ... Create more subviews 
// UIView view2 = [[UIView alloc] init]; 
// ... 

// Stack the subviews 
[stackView addArrangedSubview:view1]; 
[stackView addArrangedSubview:view2]; 

Wynik jest stos z widokiem tuż obok siebie, z odstępem:

enter image description here

Odpowiedz

46

Aktualizacja dla iOS 11 StackViews z klienta Odstępy

Firma Apple dodała możliwość ustawiania spacji niestandardowej w iOS 11. Po każdym uporządkowanym wyglądzie należy określić odstępy. Niestety nie można wcześniej określić odstępu.

stackView.setCustomSpacing(10.0, after: firstLabel) 
stackView.setCustomSpacing(10.0, after: secondLabel) 

Jeszcze lepszy niż korzystanie z własnych widoków.

Dla iOS 10 i poniżej

Można po prostu dodać przejrzysty widoki do widoku stosu i dodać szerokość ograniczenia do nich.

(Label - UIView - Etykieta - UIView -label)

i jeśli trzymać distribution do wypełnienia, a następnie można skonfigurować zmienne ograniczenia szerokości na swoim UIViews.

Ale zastanawiałbym się, czy jest to odpowiednia sytuacja, aby użyć stackviews, jeśli tak jest. Funkcja Autolayout bardzo ułatwia konfigurowanie różnych szerokości między widokami.

+2

Dzięki, ale miałem nadzieję, że nie będę musiał uciekać się do pustych widoków, aby dodać miejsca lub wrócić do automatycznego układu. Chociaż jeśli UIStackView nie obsługuje mojego przypadku użycia, być może i tak będę musiał. – yura

+1

Dlaczego chcesz, aby odstępy były zmienne? Możesz mieć zmienne odstępy, jeśli używasz "dystrybucji" "równego centrowania". Spowoduje to, że centra będą miały szerokość równą szerokości, ale odstępy będą się różnić. Wyjaśnij więcej o swoim przypadku użycia. –

+0

Zasadniczo mam kilka widoków, które muszę rozpowszechniać poziomo (lub pionowo) z góry określonej przestrzeni między widokami, które mogą ale nie muszą być tej samej wartości. Chcę móc określić te marginesy za pomocą layoutMargins lub innego mechanizmu. – yura

Powiązane problemy