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.


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.


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


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


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)...

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)


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.


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.


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ę.


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.


-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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.