Was ist "Beschränkung auf Rand" in Storyboard in Xcode 6


248

Ich arbeite mit Autolayout und Einschränkungen und habe festgestellt, dass es Constrain to marginsin Xcode 6 eine Option gibt, die in Xcode 5 nicht vorhanden war und standardmäßig aktiviert ist.

Ich habe ein Testprojekt erstellt und dann UITableViewein ViewController hinzugefügt, dessen Frame auf die gleiche Größe wie die Ansicht eingestellt ist, und Einschränkungen hinzugefügt

Xcode 6 Sie können hier sehen, obwohl die Tabellenansicht denselben Rahmen wie die Ansicht hat. Xcode schlägt vor, -16 als Einschränkung hinzuzufügen, während Xcode 5 das Hinzufügen des Abstands 0 vorschlagen würde.

Wenn die Option "Rand einschränken" aktiviert ist

Wenn Sie nun die Option "Auf Rand beschränken" deaktivieren, verhält sie sich wie Xcode 5 und schlägt vor, 0 als Einschränkung hinzuzufügen

Mit Einschränkung auf Rand UnChecked

Außerdem habe ich festgestellt, dass ich die Storyboard-Datei in Xcode 5 nicht mehr öffnen kann, wenn ich die Einschränkung mit dem eingeschränkten Rand hinzugefügt habe. Daher ist sie in Xcode 6 definitiv etwas Neues

Hoffentlich kann ich meine Frage richtig erklären. Ich würde gerne verstehen, was "Randbeschränkung" tatsächlich bewirkt und wann ich es verwenden sollte und wann nicht. Ich entschuldige mich, wenn es etwas sehr Einfaches und Offensichtliches ist.

BEARBEITEN

Ich habe hier in der Diskussion etwas über Layoutränder gefunden . Ich frage mich, ob es damit zusammenhängt.


15
Keine Notwendigkeit, sich zu entschuldigen - es ist nicht offensichtlich, was das überhaupt bewirkt.
Ben Clayton

4
+1 Ich brauche mich nicht zu entschuldigen, ich wollte auch diese Frage stellen. Übrigens: Um
Olaf

1
Dies kommt einer Erklärung am nächsten, die ich gefunden habe: stackoverflow.com/questions/25275901/…
Nathaniel

Wie deaktiviere ich das?
Orkenstein

2
Ja, das ist der wahre Schmerz. Ich konnte nicht herausfinden, wie ich es dauerhaft deaktivieren kann.
Bhumit Mehta

Antworten:


315

Ich verstehe überhaupt nicht, warum sich die Leute beschweren, dass " Ränder vor iOS 8 einen regelrechten Absturz verursachen würden. "

Das Festlegen Ihrer Einschränkungen in Bezug auf den Rand in einer XIB-Datei oder einem Storyboard führt NICHT zum Absturz Ihrer App unter iOS7, und es macht auch auf Ihrem iOS7-Gerät keinen Unterschied in der Benutzeroberfläche, solange Sie die Eigenschaften UIView.layoutMarginsund UIView.preservesSuperviewLayoutMarginsin Ihrem Code nicht berühren .

Was ist Ränder in iOS8

Layoutränder stellen eine Polsterung um das Innere von a dar UIView, die das Layoutsystem beim Layouten von Unteransichten verwenden kann, um sicherzustellen, dass zwischen dem Rand einer Ansicht und einer Unteransicht eine Lücke verbleibt. In dieser Hinsicht ähnelt es sehr der Auffüllungseigenschaft, die Blöcken in CSS zugeordnet ist.

Geben Sie hier die Bildbeschreibung ein

Standardmäßig UIViewhat a Layoutränder von 8 Punkten auf jeder Seite, und dies kann im Interface Builder nicht geändert werden . Durch Festlegen der UIView.layoutMarginsEigenschaft im Code, der nur unter iOS8 verfügbar ist, können Sie diese Werte jedoch anpassen.

Sie können IB veranlassen, die Ränder mit Editor> Leinwand> Layoutrechtecke anzeigen anzuzeigen : Geben Sie hier die Bildbeschreibung ein

Ränder können verwendet werden, um das Layout Ihrer Ansichten und Unteransichten zu erleichtern. Alle UIViewwerden standardmäßig mit Rändern geliefert, sie wirken sich jedoch nur dann auf die Platzierung der Ansicht aus, wenn Sie eine Einschränkung einrichten, die sich auf einen Rand bezieht.

Verwendung von Rändern

Die einzige Möglichkeit, Ränder in Interface Builder zu verwenden, besteht darin, die Option Relativ zu Rand zu aktivieren, während Sie Ihre Einschränkungen konfigurieren. Auf diese Weise lenken Sie Ihre Einschränkung auf die Verwendung von Rändern anstelle von Kanten, wenn Sie meine Ansicht gestalten.

Geben Sie hier die Bildbeschreibung ein

Schauen wir uns vier verschiedene Möglichkeiten an, um eine führende Einschränkung zwischen einer Ansicht und ihrer Unteransicht einzurichten. Für jede Einschränkung, die wir überprüfen, ist die erste beschriebene Zuordnung die führende der Unteransicht und die zweite die führende der Übersicht . Was Sie besonders beachten möchten, ist der Status zum Aktivieren und Deaktivieren der Option Relativ zum Rand jedes Einschränkungsende, da hiermit festgelegt wird, ob die Einschränkung an den Rand oder den Rand der Ansicht gebunden ist.

  1. Erstes Element (Deaktivieren), zweites Element (Aktivieren): In diesem Fall erklären wir, dass der linke Rand der Unteransicht am linken Rand der Übersicht ausgerichtet werden soll (wie in diesem Bild gezeigt).

Geben Sie hier die Bildbeschreibung ein

  1. Erstes Element (deaktivieren), zweites Element (deaktivieren): Beide verwenden Kante, nicht Rand . In diesem Fall erklären wir, dass der linke Rand der Unteransicht am linken Rand der Übersicht ausgerichtet werden soll.

Geben Sie hier die Bildbeschreibung ein

  1. Erstes Element (Häkchen), zweites Element (Deaktivieren): In diesem Fall erklären wir, dass der linke Rand der Unteransicht am linken Rand der Übersicht ausgerichtet werden soll. Durch diese Art von Layout überlappt die Unteransicht tatsächlich die Übersicht.

Geben Sie hier die Bildbeschreibung ein

  1. Erster Punkt (Scheck), zweiter Punkt (Scheck). Dies hat tatsächlich den gleichen Effekt wie Fall 2, da sowohl die Unteransicht als auch die Übersicht denselben Standardspielraum haben. Wir erklären, dass der linke Rand der Unteransicht am linken Rand der Übersicht ausgerichtet werden soll.

Geben Sie hier die Bildbeschreibung ein

Was ist gut an Rändern?

Diese neue Funktion (iOS8) wirkt sich nur dann auf die Entwicklung der Benutzeroberfläche aus, wenn Sie Ränder verwenden.

Mithilfe von Rändern können Sie die Platzierung mehrerer Unteransichten anpassen, die eine gemeinsame Beziehung zu einer gemeinsam genutzten Übersicht haben, indem Sie den Wert einer einzelnen Eigenschaft ändern. Dies ist ein klarer Gewinn, wenn Sie alle zugehörigen Einschränkungen mit festen Werten festlegen. Wenn Sie den gesamten Abstand aktualisieren müssen, anstatt jeden Wert einzeln zu ändern, können Sie gleichzeitig alle relevanten Platzierungen ändern, indem Sie den Rand der Übersicht mit einer einzigen Zeile aktualisieren Code wie dieser:

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

Um diesen Vorteil zu veranschaulichen, werden im folgenden Fall die linken Ränder aller Unteransichten am linken Rand ihrer Übersicht ausgerichtet. Wenn Sie also den linken Rand der Übersicht ändern, wirken sich alle Unteransichten gleichzeitig aus.

Geben Sie hier die Bildbeschreibung ein


Danke für die ausführliche Erklärung. Ich markiere dies als akzeptierte Antwort, da dies die Dinge gut erklärt.
Bhumit Mehta

Danke @Bhumit, hoffe diese Antwort hilft.
Scott Zhu

4
"Ich verstehe überhaupt nicht, warum sich die Leute beschweren". Nun, vielleicht hat sich das Verhalten mit einer der letzten Betas geändert, die ich nicht überprüft habe. Aber vor mindestens einigen Monaten hat es einen Absturz verursacht, auch wenn Sie nicht versucht haben, die layoutMargins in Code zu setzen.
KPM

Es ist erwähnenswert, dass Sie beim Hinzufügen neuer Einschränkungen in neueren Versionen von Xcode ein Kontrollkästchen für "Auf Ränder beschränken" deaktivieren können, das dasselbe Flag "Relativ zu Rändern" setzt. Dies ist nützlich, da es ein paar Klicks spart! Tolle Antwort übrigens, so gut erklärt und die Bilder waren sehr hilfreich.
EricWasTaken

Ich habe festgestellt, dass die Bilder auf Dropbox gehostet werden. Wäre es nicht besser, die Bilder auf SO zu hosten?
Testen

63

In iOS 8 haben Sie jetzt die Möglichkeit, Ihre Einschränkungen relativ zu einem vordefinierten Rand für die Grenzen der Übersicht zu definieren, anstatt die Grenzen der Übersicht selbst. Ja, es hängt vollständig mit den Layouträndern zusammen, auf die Sie in den Dokumenten hingewiesen haben. Ein Vorteil besteht darin, dass Sie Ihre Ränder für jeden Gerätetyp dynamisch oder unterschiedlich neu definieren können und das Layout entsprechend aktualisiert wird, ohne die Einschränkungen zu ändern.

Wann Sie es verwenden: Wenn Sie diese neue Flexibilität nutzen möchten.

Wann Sie es NICHT verwenden sollten: Für jede App, die unter iOS 7 oder niedriger ausgeführt werden soll.


21
Dies wäre eine nette Funktion, wenn sie nicht standardmäßig aktiviert wäre und dennoch einen direkten Absturz auf irgendetwas vor iOS 8 verursachen würde.
TylerJames

1
Konnte nicht mehr zustimmen.
KPM

42

Die Eigenschaft auf UIView ist : layoutMargins. Siehe die Apple Docs . Wenn die Layoutränder 8,8,8,8 (Standardeinstellung) sind, hat eine Einschränkung mit 0, die zum Containerrand führt, eine x-Position von 8. Beachten Sie, dass dies nur unter iOS8 oder höher verfügbar ist.

Für alle, die nicht möchten, dass ihre Einschränkungen an den Containerrand gehen:

STRG + Klicken + Ziehen, um das Popup zum Erstellen von Einschränkungen anzuzeigen.

Wenn im Menü angezeigt wird, dass die Einschränkung für den Rand standardmäßig erstellt werden soll, halten Sie die Optionstaste / Alt gedrückt, damit die Einschränkung für den Container und nicht für den Containerrand vorgenommen werden kann.

Jetzt wird die Option angezeigt, die Einschränkung NICHT am Rand zu erstellen. Dies ist viel schneller in meiner Nutzung.


3
Dies ist wahrscheinlich die beste Lösung, die ich dort gefunden habe. Das Deaktivieren von "Auf Ränder beschränken" funktioniert nicht immer und fühlt sich etwas zu magisch an. Dies ist perfekt.
Levi McCallum

Warum um alles in der Welt ist die Standardeinstellung nicht 10pt?
ZaBlanc

11
Apple hat in der Vergangenheit Längen und Größen basierend auf Usability-Untersuchungen ausgewählt, nicht durch die Auswahl von Zahlen, die wir, die Code lesen, bevorzugen. Beispielsweise beträgt die Standardhöhe für viele Dinge 44 oder 35 pt. @ ZaBlanc
Kyle Robson

Perfekte Lösung, wenn ich standardmäßig Einschränkungen für das Storyboard ohne Rand hinzufüge. Danke dir!
Inix
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.