2013-07-11 2 views
17

Mam dwa UButtons, jeden na drugim, w superview, którego wysokość może być zmieniana. Oba przyciski powinny mieć stały pionowy odstęp między nimi, ale odległość między górną i dolną przestrzenią powinna być zmieniana, tak aby dwa przyciski pozostały w środku w widoku podglądu podczas zmiany rozmiaru.AutoLayout: Pionowe wyśrodkowanie dwóch UIViews w widoku nadrzędnym, który może zmienić rozmiar

że próbował tworząc dwie mniej niż lub równy ograniczenia (z równą pierwszeństwa), w odstępie od SuperView dla każdego przycisku, oraz stałą pionową odstępy pomiędzy przyciskami, jak pokazano poniżej: enter image description here

(Powód, dla którego jest on mniejszy lub równy, wynika z tego, że ten widok jest zdefiniowany na danej wysokości w IB dla ekranów 4 ", ale może być skurczony dla ekranów 3.5"). Jednak nie robi tego podstęp, jak widać na zrzucie ekranu, gdy aplikacja jest uruchomiona: enter image description here

To prawie tak, jakbyś chciał powiedzieć AutoLayout, że tw o same ograniczenia powinny mieć równe wartości, nawet jeśli oba są ustawione na "mniejszy lub równy". Czy istnieje sposób, aby zrobić to, co próbuję zrobić, a może lepszy sposób?

+0

Używasz konspektów lub interfejsu Builder? –

+0

Scenorysy w ramach IB. –

Odpowiedz

12

To jest tak trywialne zrobić w IB.

1)^przeciągnij z przycisku 1 do góry. wybierz "środek w poziomie w pojemniku".

2)^przeciągnij z przycisku 1 na lewo. wybierz "środek w pionie w pojemniku".

3) wykonaj to samo z przyciskiem 2.

4) Teraz jedyną rzeczą do zrobienia jest rozmiar przycisków, ponieważ tak to wygląda.

enter image description here

Jest to również bardzo trywialne.

5)^przeciągnij z przycisku 1 w lewo. wybierz "wiodącą przestrzeń do marginesu kontenera".

6)^przeciągnij z przycisku 1 w prawo. wybierz "końcowe spacje do marginesu kontenera".

7) wykonaj dokładnie to samo za pomocą przycisku 2.

Gotowy produkt, wygląda następująco (NB I nie dość wycentrowania ich, ale mogę mieć dość łatwo):

enter image description here

enter image description here

+9

Ta zaakceptowana odpowiedź nie jest dokładna. Pierwsza sekcja, w której autor mówi, aby po prostu dodać wiązania środkoweX i środkoweY, NIE spowoduje wizualizacji pokazanych na poniższych zrzutach ekranu. Jeśli ustawisz dwa UIView do tego samego centerX i Y, będą one ułożone w indeksie z. Dokładne zrzuty ekranu pokazują je jako pojedynczy przycisk. Strzec się. – garrettmurray

+1

@garrettmurray przeciągnij przyciski tam, gdzie chcesz, a następnie wykonaj odpowiednie kroki. Może być również konieczna aktualizacja ograniczeń. Dzięki temu nauczysz się korzystać z więzów centrujących, które dostosują się prawidłowo do zmian orientacji. W mojej odpowiedzi zakładam odrobinę bardzo podstawowej wiedzy o autolayout. – smileBot

2

Jednym ze sposobów osiągnięcia tego jest zamknięcie dwóch przycisków w innym interfejsie UIView i wyśrodkowanie tego widoku w widoku kontrolera. Daj przyciskom ustaloną odległość do górnej i dolnej części tego widoku oraz ustaloną odległość między nimi lub stałą wysokość widoku.

+0

Próbowałem to zrobić, ale nie mogłem go uruchomić. W każdym razie wydaje się, że powinieneś być w stanie zrobić to, co próbuję zrobić bez zawijania wszystkiego w innym UIView. –

+0

@JamieForrest, nie sądzę, że łatwo jest zrobić bez zawijania go w innym widoku. Zrobiłem to po prostu przeciągając dwa przyciski na widok kontrolera, wybierając je oba, osadzając w UIView (z menu), a następnie wyśrodkowując ten widok. Jak próbowałeś to zrobić i jaki uzyskałeś rezultat? – rdelmar

+2

Czy nie ma sensu Autolayout, abyśmy nie potrzebowali enkapsulacji widoków w widoku kontenera? – ninjaneer

4

Uzgodniono z rdelmar. Oto kolejna opcja, jeśli chcesz zachować hierarchię widoków.

Obecnie rozmieszczasz przyciski u góry iu dołu za pomocą wiązań. Zamiast tego utwórz dwa puste UIView s, będą one używane jako przekładki. Powinny być umieszczone jeden u góry i jeden u dołu przycisków. Korzystając z więzów autolayout, upewnij się, że wysokość tych dwóch widoków przerywnika jest zawsze równa. Upewnij się, że są one przypięte odpowiednio do górnej i dolnej części przycisków oraz górnej i dolnej części widoku super.

W języku VFL: V:|-[spacer1(==spacer2)]-[button1]-(20)-[button2]-[spacer2(==spacer1)]-|.

Być może będziesz musiał to zrobić w kodzie, nie jestem pewien, czy IB może to zrobić.

+0

To działa. Ale nie jest ładna. –

+0

@JasonMoore "Opisz układ za pomocą ios w dwóch krótkich zdaniach" – Dbl

7

Najprostszy sposób na wycentrowanie w pionie to dodanie ograniczenia NSLayoutAttributeCenterY - najlepiej do elementu znajdującego się w pobliżu środka widoku. A jeśli wszystkie widoki mają pionowe ograniczenia odstępu, wszystkie zostaną wyśrodkowane. Nie musisz zgłupiać z hierarchią widoku ani dodawać widoków z przekładek.

[self.view addConstraint: 
    [NSLayoutConstraint constraintWithItem:button2 
           attribute:NSLayoutAttributeCenterY 
           relatedBy:NSLayoutRelationEqual 
            toItem:self.view 
           attribute:NSLayoutAttributeCenterY 
           multiplier:1.0 
            constant:0]]; 

Aby dopasować pozycję, ustaw stałą. Na przykład: constant:-30 przesunie go o 30 punktów.

Można również zakotwiczać elementy na podstawie różnych obszarów logicznych widoku. Na przykład, jeśli chcesz zakotwiczyć pierwszy przycisk na 25% wysokości widoku, możesz ustawić mnożnik na 0.5.