Jak dodać początkowe wypełnienie do widoku dodanego wewnątrz UIStackView

126

To jest moja konfiguracja: mam UIScrollViewwiodącą, górną, próbną krawędź ustawioną na 0. Wewnątrz tego dodaję UIStackViewz następującymi ograniczeniami:

stackView.centerYAnchor.constraintEqualToAnchor(selectedContactsScrollView.centerYAnchor).active = true  
stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

Wewnątrz widoku stosu dodaję kilka widoków.
Mój problem polega na tym, że ze względu na ograniczenia pierwszy widok dodany do widoku stosu również będzie miał krawędź natarcia = 0.

W jaki sposób mogę dodać dopełnienie do pierwszego widoku? Bez dostosowywania ograniczeń widoku przewijania.

Adrian
źródło
2
czy mógłbyś zmienić zaakceptowaną odpowiedź? Odpowiedź Tolgi wydaje się znacznie lepsza.
Honey

Odpowiedzi:

26

Rozwiązanie, które podałeś, nie dodaje dopełnienia dla twoich widoków w twoim UIStackView (jak chciałeś w pytaniu), ale dodaje wiodący dla UIStackView.

Rozwiązaniem mogłoby być dodanie kolejnego UIStackView w oryginalnym UIStackView i podanie prowadzącego do tego nowego UIStackVIew. Następnie dodaj swoje widoki do tego nowego UIStackView.

Wskazówka, możesz to zrobić całkowicie za pomocą Interface Builder. Innymi słowy, nie ma potrzeby pisania kodu.

William Kinaan
źródło
374

Gdy isLayoutMarginsRelativeArrangementwłaściwość ma wartość true, widok stosu układa rozmieszczone widoki względem marginesów układu.

stackView.layoutMargins = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20)
stackView.isLayoutMarginsRelativeArrangement = true

Ale ma to wpływ na wszystkie rozmieszczone widoki wewnątrz widoku stosu. Jeśli chcesz, aby dopełnienie dotyczyło tylko jednego widoku ułożonego, musisz użyć zagnieżdżonegoUIStackView

Tolga Okur
źródło
2
isLayoutMarginsRelativeArrangementjest getter, setter jest layoutMarginsRelativeArrangement. Nie mogę edytować odpowiedzi
maross
5
@maross nie ma różnicy między funkcją getter i setter w języku Swift. Ale masz rację, ludzie, którzy rozwijają się z Objective-C, powinni layoutMarginsRelativeArrangementzamiast tego używać . Oficjalna dokumentacja: developer.apple.com/reference/uikit/uistackview/…
Tolga Okur
3
Dla celu C:stackView.layoutMargins = UIEdgeInsetsMake(0, 20, 0, 20); [stackView setLayoutMarginsRelativeArrangement:YES];
Snouto
4
Luty 2019, o północy siedząc w biurze - takie odpowiedzi dają mi siłę, by iść do przodu. Dzięki @tolpp
nefarianblack
156

Odkryłem, że ograniczenia nie działają w widoku stosu lub wydają się nieco dziwne.

(Na przykład jeśli dodam ograniczenie wiodące / końcowe do zaznaczonego w widoku stosu obrazu, które dodaje również wiodący do widoku kolekcji, ale nie dodaje końca; i na pewno będzie to konflikt).

stackview wewnątrz stackview

Aby ustawić marginesy układu dla wszystkich widoków w widoku stosu, wybierz:

Stack View > Size Inspector > Layout Margins > Fixed

Uwaga: "Fixed"opcja była wcześniej nazywana "Explicit", jak widać na zrzutach ekranu.

Następnie dodaj wypełnienie:

scenorys

Zaporozhchenko Oleksandr
źródło
23
jedną z rzeczy, które Apple ukrywa. Nienawidzę tego, jak Xcode jest przeciwieństwem dobrego, przyjaznego i łatwego. Dzięki
Duck
Xcode ciągle się zawiesza, gdy zmieniam te wyraźne marginesy układu. Zgłoszono błąd, ale odpowiedzieli, że to duplikat.
mvandillen
Tego nie mogłem znaleźć w interfejsie użytkownika. Zmień marginesy układu na jawne, aby wyświetlić pola dla marginesów widoku stosu.
pkamb
13
FYI XCode 9 nazywa to teraz „Naprawiono” zamiast „Wyraźnie”.
Mel
Również w Xcode 9 odznacz "Użyj prowadnic układu bezpiecznego obszaru" w Inspektorze plików, co w chwili pisania wciąż powoduje wiele problemów w IB i trzymaj się normalnych przewodników układu dla twoich ograniczeń.
PJ_Finnegan
16

Pomogło mi dodanie do widoku stosu innego UIView, który jest tylko odstępnikiem (działa przynajmniej z stackView.distribution = .Fill):

let spacerView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: 10))
stackView.addArrangedSubview(spacerView)
stackView.addArrangedSubview(viewThatNeedsSpaceBeforeIt)
stackView.addArrangedSubview(NextView)...
dorsz
źródło
6

swift 3: Wystarczy ustawić przesunięcie przez:

firstView.leadingAnchor.constraint(equalTo: parentView.leadingAnchor, constant: 200).isActive = true

Upewnij się, że to ograniczenie jest ustawione po tobie parentView.addArrangdSubView(firstView)

William Hu
źródło
4

Jeśli potrzebujesz tylko początkowego wypełnienia, możesz ustawić wyrównanie widoku stosu na „Końcowe”, a wtedy będziesz mógł określić unikalne Wiodące ograniczenia dla każdego z zawartych w nim podwidoków.

Jako bonus możesz również ustawić wyrównanie widoku stosu na „Środek”, a następnie możesz użyć ograniczeń wiodących i / lub końcowych, aby nadać każdemu elementowi własne wypełnienie po obu stronach.

Jonathan Parham
źródło
1

To pytanie ma już dobre odpowiedzi, choć jedna sugestia, użyj spacingwłaściwości, aby ustawić odstępy między widokami. Dla pierwszego i ostatniego widoku mogą być dwie opcje, albo ustaw wstawki zgodnie z sugestią @tolpp, albo dodaj ograniczenie dołączone do elementu nadrzędnego (widok stosu) ze stałą, aby dodać wypełnienie.

nieskończona pętla
źródło
0

To, co zrobiliśmy, to dodanie przezroczystych komponentów (np. UIButton / UIView) jako pierwszego i ostatniego elementu podrzędnego UIStackView. Następnie ustaw ograniczenie szerokości tych niewidocznych elementów potomnych, aby dostosować wyściółkę.

Crashalot
źródło
0

Rozwiązaniem byłoby posiadanie zwykłego widoku w widoku stosu, który będzie zawierał wszystkie widoki, do których chcesz dodać ograniczenia, a następnie możesz dodać ograniczenia dla elementów, które są względne w stosunku do widoków w widoku stosu. W ten sposób oryginalne widoki mogą mieć wiodące i końcowe ograniczenia w widoku stosu.

Można to zrobić w kreatorze interfejsów i programowo.

Aiden Dixon
źródło
-3

Wydaje się, że rozwiązanie było dość proste. Zamiast:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor).active = true

Właśnie napisałem:

stackView.leadingAnchor.constraintEqualToAnchor(selectedContactsScrollView.leadingAnchor, constant: 15).active = true
Adrian
źródło
1
w rzeczywistości twój kod dodaje początek dla uistackview w urscrollview, nie dodaje dopełnienia dla twoich widoków w twoim uistackview (jak stwierdza pytanie)
William Kinaan
tak, ale nie wiem, czy możesz dodać wypełnienie, więc to zadziała.
Adrian,
na początek możesz dodać inny widok uistack do swojego oryginalnego widoku uistack i nadać mu dopełnienie. następnie dodaj swoje widoki do nowego uistackview (możesz to zrobić całkowicie za pomocą kreatora interfejsu, nie musisz pisać do niego kodu)
William Kinaan
Tak, to zadziała. Możesz dodać jako odpowiedź i zaakceptuję ją.
Adrian