Próbuję programowo dodawać widoki w UIStackView. Na razie mój kod to:
UIView *view1 = [[UIView alloc]init];
view1.backgroundColor = [UIColor blackColor];
[view1 setFrame:CGRectMake(0, 0, 100, 100)];
UIView *view2 = [[UIView alloc]init];
view2.backgroundColor = [UIColor greenColor];
[view2 setFrame:CGRectMake(0, 100, 100, 100)];
[self.stack1 addArrangedSubview:view1];
[self.stack1 addArrangedSubview:view2];
Kiedy wdrażam aplikację, jest tylko jeden widok i jest on w kolorze czarnym. (View1 pobierz również parametry dla view2)
ios
objective-c
ios9
uistackview
Altimir Antonov
źródło
źródło
addArrangedSubview:
, nieaddSubview:
Odpowiedzi:
Widoki stosu używają wewnętrznego rozmiaru zawartości, więc użyj ograniczeń układu, aby zdefiniować wymiary widoków.
Istnieje prosty sposób na szybkie dodawanie ograniczeń (przykład):
Kompletny kod:
Uwaga: zostało to przetestowane na iOS 9
źródło
UIViews
nie. Gdyby oryginalny plakat używałUILabel
instancji zamiastUIView
, jego kod działałby zgodnie z oczekiwaniami. Dodałem przykład, który to demonstruje poniżej.Swift 5.0
Na podstawie @ user1046037 answer.
źródło
activate(_:)
i zazwyczaj jest to bardziej efektywne w ten sposób developer.apple.com/documentation/uikit/nslayoutconstraint/ ...UIStackView
używa wewnętrznych ograniczeń do pozycjonowania swoich uporządkowanych widoków podrzędnych. To, jakie ograniczenia są tworzone, zależy od sposobu skonfigurowania samego widoku stosu. Domyślnie widok stosu tworzy wiązania, które układają jego rozmieszczone podwidoki w linii poziomej, przypinając widok wiodący i końcowy do własnych krawędzi wiodących i końcowych. Twój kod utworzyłby układ, który wygląda następująco:Przestrzeń, która jest przydzielana do każdego widoku podrzędnego, jest określana przez szereg czynników, w tym wewnętrzny rozmiar treści podglądu podrzędnego oraz jego odporność na kompresję i priorytety obejmowania treści. Domyślnie
UIView
instancje nie definiują wewnętrznego rozmiaru zawartości. Jest to coś, co jest zwykle dostarczane przez podklasę, taką jakUILabel
lubUIButton
.Ponieważ odporność na kompresję treści i priorytety przytulania treści są dwa nowe
UIView
wystąpień będą takie same, a żaden widok nie zapewnia wewnętrznego rozmiaru zawartości, mechanizm układu musi jak najlepiej określić, jaki rozmiar powinien zostać przydzielony do każdego widoku. W twoim przypadku jest to przypisanie pierwszemu widokowi 100% dostępnej przestrzeni, a drugiemu nic.Jeśli zmodyfikujesz swój kod, aby
UILabel
zamiast tego używał instancji, uzyskasz lepsze wyniki:Zwróć uwagę, że nie jest konieczne samodzielne tworzenie żadnych ograniczeń. To jest główna zaleta używania
UIStackView
- ukrywa przed programistą (często brzydkie) szczegóły zarządzania ograniczeniami.źródło
UIView
same w sobie nie mają wewnętrznego rozmiaru. Może być konieczne zastosowanie dodatkowych ograniczeń do tych widoków, aby widok stosu wiedział, jak duże mają być one utworzone.MyTextField.top = top+20
ibottom = MyTextField.bottom+20
. Spodziewałbym się, że dałoby to mojemu poglądowi wewnętrzną wysokość 70, ale zamiast tego narzeka na sprzeczne ograniczenia. Czy wiesz, co tu się dzieje? To jest ten widok, który chcę umieścić w moim UIStackView.W Swift 4.2
źródło
Musisz ustawić typ dystrybucji. W swoim kodzie wystarczy dodać:
Możesz też ustawić dystrybucję bezpośrednio w programie do tworzenia interfejsów. Na przykład:
Mam nadzieję, że to pomoże;) Lapinou.
źródło
Kolejne dwie linijki rozwiązały mój problem
Wersja Swift -
źródło
W przypadku zaakceptowanej odpowiedzi, gdy próbujesz ukryć jakikolwiek widok w widoku stosu, ograniczenie nie działa poprawnie.
Powodem jest to, że kiedy hide the
view
instackView
, ustawi wysokość na 0, aby go ożywić.Rozwiązanie Zmień ograniczenie
priority
jak poniżej.źródło
Ulepszona odpowiedź przez @Oleg Popov
źródło
W moim przypadku bałam się, że spodziewałbym się, że brakuje mi tej linii:
Po tym nie ma potrzeby ustawiania ograniczeń dla moich aranżowanych podglądów podrzędnych, załatwia to stackview.
źródło
Wersja Swift 5 odpowiedzi Olega Popova , oparta na odpowiedzi użytkownika1046037
źródło
Właśnie natknąłem się na bardzo podobny problem. Jak wspomniano wcześniej, wymiary widoku stosu zależą od jednego wewnętrznego rozmiaru zawartości uporządkowanych widoków podrzędnych. Oto moje rozwiązanie w Swift 2.x i następująca struktura widoku:
widok - UIView
customView - CustomView: UIView
stackView - UISTackView
uporządkowane podglądy - niestandardowe podklasy UIView
źródło
Wypróbuj poniższy kod,
Mam nadzieję, że to działa. Daj mi znać, jeśli potrzebujesz więcej wyjaśnień.
źródło