Automatyczne maskowanie programowo w porównaniu z programem Builder / xib / nib


216

Miałem (prawdopodobnie fałszywe) założenie, że włączenie wskaźnika prawego marginesu w Xib jest równoznaczne z użyciem UIViewAutoresizingFlexibleLeftMarginkodu wewnętrznego i tak dalej.

Tak więc myślałem zgodnie z tą migawką: wprowadź opis zdjęcia tutaj

Później dzisiaj musiałem sprawdzić krzyż i natknąłem się na ten wątek .

A także dokumentację Apple, zatytułowaną „Automatyczne przetwarzanie zmian układu za pomocą reguł automatycznej zmiany rozmiaru” w tym linku: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatingViews.html

Tak więc mam teraz w głowie nową koncepcję tego, w jaki sposób programowe ustawienie masek automatycznej zmiany wielkości byłoby równoważne ustawieniom xib:

Scenariusz 1 : Tylko ustawienie (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)odpowiada:

(UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight)

W XIB?

Scenariusz 2 : Ustawienie (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)w kodzie odpowiada:

|

W XIB?

Czy moje 2 odnowione scenariusze są prawidłowe? Czy teraz rozumiem?


3
Żartujesz sobie? Ale wydaje się, że tam też jest moje zamieszanie. Więc jeśli chcę przytulić górę, włączam automatyczne powiększanie dołu. Dobra robota, jabłko. To najbardziej idiotyczne ustawienie, jakie kiedykolwiek widziałem.
user4951

1
Jeśli chcesz przytulić górę, musisz upewnić się, że w kodzie maski bitowej nie wspomnisz o UIViewAutoresizingF FlexibleTopMargin. Moje wcześniejsze założenie było błędne i dlatego opublikowałem to pytanie, aby wyjaśnić sprawę.
Raj Pawan Gumdal

Twoje założenie jest prawidłowe. Gdzie się mylisz
user4951

Tak, dwa przytoczone scenariusze są poprawne.

3
Zrobiłem do tego proste narzędzie: erkanyildiz.me/lab/autoresizingmask, którego możesz użyć.
erkanyildiz

Odpowiedzi:


35

Tak, w Konstruktorze interfejsów jest to „odwrócone” w pewnym sensie (lub UIView, w zależności od tego, jak na to patrzysz). Twoje cytowane „scenariusze” są prawidłowe.


47

Tak, zacytowałeś wszystko poprawnie. Zgadzam się również, że wydaje się to nieco zacofane, dlatego doceniam twój post.

Możesz użyć makra preprocesora, UIViewAutoresizingFlexibleMarginsgdy margines UIView będzie elastyczny we wszystkich kierunkach. Umieszczam to w prekompilowanym pliku nagłówkowym, aby był uwzględniany wszędzie.

#define UIViewAutoresizingFlexibleMargins                 \
              UIViewAutoresizingFlexibleBottomMargin    | \
              UIViewAutoresizingFlexibleLeftMargin      | \
              UIViewAutoresizingFlexibleRightMargin     | \
              UIViewAutoresizingFlexibleTopMargin

Użycie UIViewAutoresizingFlexibleMarginssprawi, że element interfejsu pozostanie wyśrodkowany, ponieważ NIE będzie obejmował żadnej strony. Aby element wzrastał / zmniejszał się wraz z rodzicem, ustaw odpowiednio UIViewAutoresizingFlexibleWidthi UIViewAutoresizingFlexibleHeight.

Lubię używać, UIViewAutoresizingFlexibleMarginsponieważ mogę później odwoływać się do niego w następujący sposób:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

zamiast

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;

Często widzę te marginesy LUB połączone razem w jednym wierszu, jak w powyższym przykładzie. Po prostu trudne do odczytania.


4
Elastyczność we wszystkich kierunkach powinna być (UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight) Chyba? A może znów się mylę!
Raj Pawan Gumdal

4
FlexibleMargins sprawi, że element pozostanie wyśrodkowany (nie będzie obejmował lewego, górnego, prawego lub dolnego marginesu). Elastyczna szerokość / wysokość sprawi, że element interfejsu użytkownika odpowiednio wzrośnie / zmniejszy.
Sam

4
Czy wszystko jest teraz jasne? Poza tym naprawdę to miałem na myśli, gdy powiedziałem, że doceniam twój post. Właściwie to faworyzowałem, bo w przeszłości mnie to pomieszało. Myślę, że to świetne pytanie.
Sam

3
Tak, dziękuję, teraz rozumiem, „Elastyczne marginesy” i „Elastyczna szerokość / wysokość”. To wszystko tłumaczy, a twoje „nie przytulanie lewego, górnego, prawego lub dolnego marginesu” to dobry sposób na wyjaśnienie :)
Raj Pawan Gumdal,

0

wprowadź opis zdjęcia tutaj

Włączenie pionowej / poziomej strzałki (zwanej sprężyną) wewnątrz pudełka sprawi, że wysokość / szerokość będą elastyczne. Ale włączenie linii zewnętrznej (zwanej rozpórką) spowoduje, że ta strona będzie nieelastyczna / nieelastyczna.

Włączenie zewnętrznej lewej linii (lewa rozpórka) nie jest równoważne z włączeniem UIViewAutoresizingFlexibleRightMargin. Zamiast UIViewAutoresizingFlexibleRightMargin= na razie prawo amortyzatora wyłączona, wyłączone czy włączone prawo amortyzatora.

Na początku jest to dość mylące, ale jeśli przyjrzysz się uważnie, istnieje różnica w sprężynach i rozpórkach. Nie wiem, dlaczego Apple to zrobił, ale dla mnie były przypadki, w których łatwiej było z niego korzystać. A użycie przeciwnych właściwości w kodzie jest jeszcze bardziej mylące.


0

Swift 4 używa tego

gadBannerView?.autoresizingMask = [.flexibleRightMargin  , .flexibleLeftMargin , .flexibleTopMargin , .flexibleBottomMargin]

Cel C

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
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.