Programmierte automatische Größenanpassung von Masken im Vergleich zu Interface Builder / xib / nib

216

Ich war in einer (wahrscheinlich falschen) Annahme, dass das Aktivieren des Indikators für den rechten Rand in xib der Verwendung von UIViewAutoresizingFlexibleLeftMarginInsider-Code usw. entspricht.

Also habe ich nach diesem Schnappschuss gedacht: Geben Sie hier die Bildbeschreibung ein

Später heute musste ich nachprüfen und bin auf diesen Thread gestoßen .

Und auch die Apple-Dokumentation mit dem Titel "Abschnitt Automatische Behandlung von Layoutänderungen mithilfe von Regeln für die automatische Größenänderung" in diesem Link: https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingViews/ CreatingViews.html

Daher habe ich jetzt ein neues Konzept im Kopf, wie das programmgesteuerte Festlegen von Masken für die automatische Größenänderung den xib-Einstellungen entspricht:

Szenario 1 : Nur die Einstellung (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)entspricht:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)

In XIB?

Szenario 2 : Die Einstellung (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)im Code entspricht:

(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin)

In XIB?

Sind meine 2 erneuerten Szenarien korrekt? Bin ich gerade in meinem Verständnis?

Raj Pawan Gumdal
quelle
3
Du veräppelst mich? Aber da scheint auch meine Verwirrung zu sein. Wenn ich mich also oben umarmen möchte, schalte ich die untere Autoresize ein. Gute Arbeit Apfel. Dies ist das idiotischste Setup, das ich je gesehen habe.
user4951
1
Wenn Sie oben umarmen möchten, müssen Sie sicherstellen, dass UIViewAutoresizingFlexibleTopMargin im Bitmaskencode nicht erwähnt wird. Meine frühere Annahme war falsch und deshalb hatte ich diese Frage gestellt, um Dinge zu klären.
Raj Pawan Gumdal
Ihre Annahme ist richtig. Wo liegst du falsch
user4951
Ja, die beiden von Ihnen genannten Szenarien sind korrekt.
3
Ich habe dafür ein einfaches Tool erstellt: erkanyildiz.me/lab/autoresizingmask, das Sie verwenden können.
erkanyildiz

Antworten:

35

Ja, Interface Builder hat es in gewissem Sinne "umgekehrt" (oder UIView, je nachdem, wie Sie es betrachten). Ihre zitierten "Szenarien" sind korrekt.

DarkDust
quelle
47

Ja, Sie haben die Dinge richtig zitiert. Ich stimme auch zu, dass es sich etwas rückwärts anfühlt, deshalb schätze ich Ihren Beitrag.

Möglicherweise UIViewAutoresizingFlexibleMarginsmöchten Sie ein Präprozessor-Makro verwenden, wenn Sie den Rand eines UIView in alle Richtungen flexibel gestalten möchten. Ich habe dies in die vorkompilierte Header-Datei eingefügt, damit es überall enthalten ist.

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

Durch UIViewAutoresizingFlexibleMarginsdie Verwendung bleibt ein UI-Element zentriert, da es KEINE Seite umarmt. Um das Element wachsen / schrumpfen mit seinen Eltern, stellen die UIViewAutoresizingFlexibleWidthund UIViewAutoresizingFlexibleHeightjeweils.

Ich benutze es gerne, UIViewAutoresizingFlexibleMarginsweil ich es später wie folgt referenzieren kann:

myView.autoresizingMask = UIViewAutoresizingFlexibleMargins;

anstatt

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

Allzu oft sehe ich diese Ränder in einer Zeile ODER wie im obigen Beispiel. Nur schwer zu lesen.

Sam
quelle
4
Flexibel in jede Richtung sollte sein (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight) Ich denke? Oder bin ich wieder verwirrt!
Raj Pawan Gumdal
4
Mit FlexibleMargins bleibt das Element zentriert (ohne den linken, oberen, rechten oder unteren Rand zu umarmen). Durch die flexible Breite / Höhe wächst / schrumpft das UI-Element.
Sam
4
Ist jetzt alles klar? Außerdem habe ich es wirklich so gemeint, als ich sagte, ich schätze Ihren Beitrag. Ich habe es tatsächlich favorisiert, weil mich das in der Vergangenheit verwirrt hat. Ich denke, es ist ein großartiges Q.
Sam
3
Ja, danke, jetzt bekomme ich "Flexible Ränder" und "Flexible Breite / Höhe". Das erklärt alles und Ihr "nicht den linken, oberen, rechten oder unteren Rand umarmen" ist eine gute Erklärung :)
Raj Pawan Gumdal
0

Geben Sie hier die Bildbeschreibung ein

Durch Aktivieren des vertikalen / horizontalen Pfeils (Feder genannt) in der Box wird die Höhe / Breite flexibel. Durch Aktivieren einer Außenlinie (als Strebe bezeichnet) wird diese Seite jedoch unflexibel / nicht flexibel.

Das Aktivieren der äußeren linken Linie (linke Strebe) entspricht nicht dem Aktivieren UIViewAutoresizingFlexibleRightMargin. Stattdessen UIViewAutoresizingFlexibleRightMargin= auf , wenn rechte Strebe deaktiviert, ab , wenn rechte Strebe aktiviert.

Es ist zunächst ziemlich verwirrend, aber wenn Sie genau hinsehen, gibt es einen Unterschied in den Federn und Streben. Ich weiß nicht, warum Apple dies getan hat, aber für mich gab es einige Fälle, in denen die Verwendung einfacher war. Die Verwendung entgegengesetzter Eigenschaften im Code ist noch verwirrender.

Abdurrahman Mubeen Ali
quelle
0

Swift 4 benutze dies

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

Ziel c

myView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin;
Muhammad Nayab
quelle