Co to jest „Ogranicz do marginesu” w Storyboard w Xcode 6

249

Pracuję z autolayout i ograniczeniami i odkryłem, że Constrain to marginsw Xcode 6 jest opcja, która nie była obecna w Xcode 5 i jest domyślnie zaznaczona.

Utworzyłem projekt testowy, a następnie dodałem UITableViewna ViewController z ramką ustawioną na taki sam rozmiar jak widok i dodałem ograniczenia

Xcode 6 Możesz zobaczyć tutaj, mimo że widok tabeli ma tę samą ramkę, co widok Xcode sugeruje dodanie -16 jako ograniczenie, podczas gdy Xcode 5 sugeruje dodanie odstępu 0.

Po zaznaczeniu opcji Ogranicz do marginesu

Teraz, gdy odznaczysz opcję „Ogranicz do marginesu”, zachowuje się tak samo jak Xcode 5 i sugeruje dodanie 0 jako ograniczenia

Z ograniczeniem do marginesu niezaznaczone

Odkryłem również, że po dodaniu ograniczenia z zaznaczonym ograniczeniem do marginesu nie jestem już w stanie otworzyć pliku scenorysu w Xcode 5, więc jest to zdecydowanie coś nowego w Xcode 6

Mam nadzieję, że jestem w stanie właściwie wyjaśnić moje pytanie. Chciałbym zrozumieć, co faktycznie robi „Ogranicz do marginesu” oraz kiedy powinienem i nie powinienem go używać. Przepraszam, jeśli jest to coś bardzo prostego i oczywistego.

EDYTOWAĆ

W dyskusji znalazłem coś na temat marginesów układu , zastanawiam się, czy to się z tym wiąże.

Bhumit Mehta
źródło
15
Nie trzeba przepraszać - nie wiadomo, co to w ogóle robi.
Ben Clayton
4
+1 nie trzeba przepraszać, ja też chciałem zadać to pytanie. BTW: aby otworzyć storyboard w Xcode5, zobacz: stackoverflow.com/a/25298909/529243
Olaf
1
To jest najbliższe wyjaśnienie, które znalazłem: stackoverflow.com/questions/25275901/…
Nathaniel
Jak to wyłączyć?
orkenstein
2
Tak, to prawdziwy ból. Nie byłem w stanie dowiedzieć się, jak odznaczyć to na stałe.
Bhumit Mehta

Odpowiedzi:

315

W ogóle nie rozumiem, dlaczego ludzie narzekają, że „ Marginesy spowodowałyby absolutną awarię na czymkolwiek wcześniejszym niż iOS 8.

Ustawienie ograniczeń względem marginesu w pliku xib lub serii ujęć NIE powoduje awarii aplikacji na iOS7 i NIE robi żadnej różnicy w interfejsie użytkownika na urządzeniu z iOS7, o ile nie dotkniesz UIView.layoutMarginsi UIView.preservesSuperviewLayoutMarginswłaściwości w kodzie.

Co to są marginesy w iOS8

Marginesy Układ stanowią dopełnienie całego wnętrza Urządzony UIViewże system układ może wykorzystać podczas układania subviews - aby upewnić się, że luka jest pozostawione między krawędzią myślą i podrzędny. Pod tym względem jest to bardzo podobne do właściwości padding związanej z blokami w CSS.

wprowadź opis zdjęcia tutaj

Domyślnie a UIViewma marginesy układu 8 punktów z każdej strony i nie można tego zmienić w Konstruktorze interfejsów . Jednak ustawiając UIView.layoutMarginswłaściwość w kodzie, który jest dostępny tylko na iOS8, możesz dostosować te wartości.

Możesz sprawić, aby IB wyświetlał marginesy za pomocą Edytora> Kanwy> Pokaż prostokąty układu: wprowadź opis zdjęcia tutaj

Marginesów można użyć do ułożenia widoków i widoków podrzędnych. Każda UIViewz nich ma domyślnie marginesy, ale wpływają one tylko na umiejscowienie widoku, gdy skonfigurujesz ograniczenie związane z marginesem.

Jak korzystać z marginesów

Jedynym sposobem użycia marginesów w Konstruktorze interfejsów jest sprawdzenie opcji Względne do marginesu podczas konfigurowania ograniczeń. W ten sposób kierujesz swoje ograniczenie do korzystania z marginesów zamiast krawędzi podczas układania mojego widoku.

wprowadź opis zdjęcia tutaj

Rzućmy okiem na cztery różne sposoby ustawiania wiodącego ograniczenia między widokiem i jego widokiem podrzędnym. Dla każdego z ograniczeń, które przeglądamy, pierwsze opisane powiązanie będzie prowadzące do podview , a drugie będzie prowadzące do superview . To, na co chcesz zwrócić szczególną uwagę, to sprawdzanie i odznaczanie opcji Względne do marginesu każdego końca wiązania, ponieważ określa, czy wiązanie jest powiązane z marginesem czy krawędzią widoku.

  1. Pierwszy element (odznacz), drugi element (zaznacz): W tym przypadku deklarujemy, że lewa krawędź podglądu powinna być wyrównana do lewego marginesu podglądu (jak pokazano na tym obrazku).

wprowadź opis zdjęcia tutaj

  1. Pierwszy element (odznacz), drugi element (odznacz): Oba używają krawędzi, a nie marginesu . W tym przypadku deklarujemy, że lewa krawędź podglądu powinna być wyrównana do lewej krawędzi podglądu.

wprowadź opis zdjęcia tutaj

  1. Pierwszy element (zaznacz), drugi element (odznacz): W tym przypadku deklarujemy, że lewy margines podglądu powinien być wyrównany do lewej krawędzi superview. Ten rodzaj układu powoduje, że widok podrzędny nakłada się na podgląd.

wprowadź opis zdjęcia tutaj

  1. Pierwsza pozycja (czek), druga pozycja (czek). Ma to w rzeczywistości taki sam efekt jak przypadek 2, ponieważ zarówno widok podglądu, jak i podgląd mają ten sam domyślny margines. Oświadczamy, że lewy margines podglądu powinien być wyrównany do lewego marginesu podglądu.

wprowadź opis zdjęcia tutaj

Co jest dobrego w Margins

Ta nowa funkcja (iOS8) wpływa tylko na rozwój interfejsu użytkownika, jeśli zdecydujesz się na użycie marginesów.

Korzystając z marginesów, można dopasować położenie wielu widoków podrzędnych, które mają wspólną relację do wspólnego podglądu, zmieniając wartość pojedynczej właściwości. Jest to wyraźna przewaga nad ustawieniem wszystkich powiązanych ograniczeń stałymi wartościami, ponieważ jeśli musisz zaktualizować wszystkie odstępy, zamiast zmieniać każdą wartość jedna po drugiej, możesz jednocześnie zmodyfikować wszystkie odpowiednie umiejscowienie, aktualizując margines superwizji za pomocą jednej linii kod taki jak ten:

self.rootView.layoutMargins = UIEdgeInsetsMake(0, 50, 0, 0);

Aby zilustrować tę korzyść, w poniższym przypadku lewe krawędzie wszystkich widoków podrzędnych są wyrównane do lewego marginesu ich podglądu. Tak więc zmiana lewego marginesu superwizji wpłynie na wszystkie podviewy w tym samym czasie.

wprowadź opis zdjęcia tutaj

Scott Zhu
źródło
Dziękuję za szczegółowe wyjaśnienie. Zaznaczam to jako zaakceptowaną odpowiedź, ponieważ ładnie to wyjaśnia.
Bhumit Mehta
Dzięki @Bhumit, mam nadzieję, że ta odpowiedź pomoże.
Scott Zhu
4
„W ogóle nie rozumiem, dlaczego ludzie narzekają”. Cóż, może zachowanie się zmieniło z jedną z ostatnich bet, których nie sprawdziłem. Ale przynajmniej kilka miesięcy temu spowodowało awarię, nawet jeśli nie próbujesz ustawić layoutMargins w kodzie.
KPM
Warto zauważyć, że dodając nowe ograniczenia, nowsze wersje Xcode pozwalają odznaczyć pole „Ogranicz do marginesów”, które ustawia tę samą flagę „Względem marginesów”. Jest to przydatne, ponieważ pozwala zaoszczędzić kilka kliknięć! Świetna odpowiedź BTW, tak dobrze wyjaśniona, a obrazy były bardzo pomocne.
EricWasTaken
Zauważyłem, że zdjęcia są przechowywane na Dropbox. Czy nie lepiej byłoby hostować obrazy na SO?
testowanie
63

W iOS 8 masz teraz możliwość zdefiniowania ograniczeń w stosunku do z góry określonego marginesu granic superview, zamiast samych granic superview. Tak, jest to całkowicie związane z marginesami układu wskazanymi w dokumentach. Jedną z zalet jest to, że możesz dynamicznie lub inaczej definiować swoje marginesy dla każdego rodzaju urządzenia, a układ zostanie odpowiednio zaktualizowany bez modyfikowania ograniczeń.

Kiedy używać: kiedy chcesz skorzystać z tej nowej elastyczności.

Kiedy NIE używać: w przypadku dowolnej aplikacji, która ma działać na iOS 7 lub starszej wersji.

KPM
źródło
21
Byłaby to miła funkcja, gdyby nie była domyślnie włączona, a mimo to spowodowała całkowitą awarię na czymkolwiek wcześniejszym niż iOS 8.
TylerJames
1
Nie można zgodzić się więcej.
KPM
42

Nieruchomość na UIView jest: layoutMargins. Zobacz dokumenty Apple . Zasadniczo, jeśli marginesy układu wynoszą 8,8,8,8 (domyślnie), ograniczenie z 0 wiodącą przestrzenią do marginesu kontenera będzie miało pozycję x 8. Uwaga: jest to dostępne tylko na iOS8 lub nowszym.

Dla wszystkich, którzy nie chcą, aby ich ograniczenia sięgały do ​​marginesu kontenera:

CTRL + kliknięcie + przeciągnięcie, aby wyświetlić wyskakujące okienko tworzenia ograniczenia.

Jeśli menu pokazuje, aby domyślnie utworzyć ograniczenie do marginesu, przytrzymaj opcję / alt, aby umożliwić ograniczenie do kontenera, a nie do marginesu kontenera.

Teraz pokaże opcję utworzenia ograniczenia NIE do marginesu. W moim użyciu jest to DROGA szybsze.

Kyle Robson
źródło
3
To chyba najlepsze rozwiązanie, jakie tam znalazłem. Odznaczenie „constain to margines” nie zawsze działa i wydaje się trochę zbyt magiczne. To jest doskonałe.
Levi McCallum,
Dlaczego, u licha, wartością domyślną nie jest 10pt?
ZaBlanc
11
Apple ma historię wybierania długości i rozmiarów na podstawie badań użyteczności, a nie przez wybieranie liczb, które wolelibyśmy czytać kod. Np. Domyślna wysokość wielu rzeczy to 44 lub 35 pkt. @ZaBlanc
Kyle Robson
Idealne rozwiązanie, gdy domyślnie dodam ograniczenie do scenorysu bez marginesu. Dziękuję Ci!
inix