Ich weiß, dass viele Leute bereits Unmengen von Fragen dazu gestellt haben, aber selbst mit den Antworten kann ich es nicht zum Laufen bringen.
Wenn ich mich mit Einschränkungen im Storyboard beschäftige, ist es einfach, aber im Code fällt es mir schwer. Ich versuche zum Beispiel, eine Ansicht zu haben, die auf der rechten Seite bleibt und die Höhe des Bildschirms entsprechend der Bildschirmausrichtung hat. Das ist mein Code:
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 748)];
myView.backgroundColor = [UIColor redColor];
[self.view addSubview:myView];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:0 metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
Es erfüllt einige Einschränkungen nicht. Ich sehe nicht, was los ist. Warum kann ich eine Eigenschaft wie nicht self.myView
anstelle einer lokalen Variablen wie verwenden myView
?
objective-c
ios
constraints
autolayout
pierre23
quelle
quelle
myView
? (3) Was istvivi
(wie ACB gefragt hat)? (4) Haben Sie eine ImmobiliemyView
angemeldetself
?Antworten:
Wenn Sie das automatische Layout im Code verwenden, bewirkt das Festlegen des Rahmens nichts. Die Tatsache, dass Sie in der obigen Ansicht eine Breite von 200 angegeben haben, bedeutet also nichts, wenn Sie Einschränkungen festlegen. Damit die Einschränkungsmenge einer Ansicht eindeutig ist, sind vier Dinge erforderlich: eine x-Position, eine y-Position, eine Breite und eine Höhe für einen bestimmten Zustand.
Derzeit haben Sie im obigen Code nur zwei (Höhe relativ zur Übersicht und y-Position relativ zur Übersicht). Darüber hinaus sind zwei Einschränkungen erforderlich, die je nach Einrichtung der Einschränkungen der Übersicht der Ansicht zu Konflikten führen können. Wenn für die Übersicht eine erforderliche Einschränkung vorliegt, die angibt, dass die Höhe einen Wert von weniger als 748 aufweist, wird die Ausnahme "unbefriedigende Einschränkungen" angezeigt.
Die Tatsache, dass Sie die Breite der Ansicht festgelegt haben, bevor Sie Einschränkungen festlegen, bedeutet nichts. Es wird nicht einmal der alte Frame berücksichtigt und ein neuer Frame basierend auf allen Einschränkungen berechnet, die es für diese Ansichten angegeben hat. Wenn ich mich mit Autolayout im Code beschäftige, erstelle ich normalerweise einfach eine neue Ansicht mit
initWithFrame:CGRectZero
oder einfachinit
.Um den Einschränkungssatz zu erstellen, der für das Layout erforderlich ist, das Sie in Ihrer Frage mündlich beschrieben haben, müssen Sie einige horizontale Einschränkungen hinzufügen, um die Breite und die x-Position zu begrenzen, um ein vollständig angegebenes Layout zu erhalten:
Die verbale Beschreibung dieses Layouts lautet wie folgt, beginnend mit der vertikalen Einschränkung:
Wenn Sie einfach möchten, dass die Ansicht die gesamte Höhe der Übersicht füllt, ohne die Höhe der Übersicht zu beschränken, lassen Sie den
(>=748)
Parameter im Text des visuellen Formats einfach weg . Wenn Sie der Meinung sind, dass der(>=748)
Parameter erforderlich ist, um ihm eine Höhe zu geben, tun Sie dies in diesem Fall nicht: Befestigen Sie die Ansicht mit der Syntax bar (|
) oder bar mit der Leerzeichen- Syntax (|-
,-|
) an den Rändern der Übersicht , geben Sie Ihrer Ansicht ein y -Position (Fixieren der Ansicht an einer einzelnen Kante) und eine y-Position mit Höhe (Fixieren der Ansicht an beiden Kanten), wodurch Ihre für die Ansicht festgelegte Einschränkung erfüllt wird.In Bezug auf Ihre zweite Frage:
Mit
NSDictionaryOfVariableBindings(self.myView)
(wenn Sie eine Eigenschaft Setup für myView haben) und Fütterung , dass in Ihr VFL verwendenself.myView
in Ihrem VFL Text, werden Sie wahrscheinlich eine Ausnahme erhalten , wenn Automatisches Layout versucht Ihren VFL Text zu analysieren. Dies hängt mit der Punktnotation in den Wörterbuchschlüsseln und dem System zusammen, das versucht, sie zu verwendenvalueForKeyPath:
. Eine ähnliche Frage und Antwort finden Sie hier .quelle
Hallo, ich habe diese Seite häufig für Einschränkungen und "How to" verwendet. Es dauerte ewig, bis mir klar wurde, dass ich Folgendes brauchte:
um dieses Beispiel zum Laufen zu bringen. Vielen Dank an Userxxx, Rob M. und insbesondere Larsacus für die Erklärung und den Code hier, es war von unschätzbarem Wert.
Hier ist der vollständige Code, damit die obigen Beispiele ausgeführt werden können:
quelle
Schnelle Version
Aktualisiert für Swift 3
In diesem Beispiel werden zwei Methoden gezeigt, mit denen die folgenden Einschränkungen programmgesteuert hinzugefügt werden können, so wie dies im Interface Builder der Fall ist:
Breite und Höhe
Im Container zentrieren
Boilerplate-Code
Methode 1: Ankerstil
Methode 2: NSLayoutConstraint-Stil
Anmerkungen
NSLayoutConstraint
Stil. Er ist jedoch nur unter iOS 9 verfügbar. Wenn Sie also iOS 8 unterstützen, sollten Sie weiterhin denNSLayoutConstraint
Stil verwenden.quelle
In Bezug auf Ihre zweite Frage zu Eigenschaften können Sie diese
self.myView
nur verwenden, wenn Sie sie als Eigenschaft in der Klasse deklariert haben. DamyView
es sich um eine lokale Variable handelt, können Sie sie nicht auf diese Weise verwenden. Für weitere Informationen hierzu empfehle ich Ihnen, die Apple-Dokumentation zu den deklarierten Eigenschaften zu lesen .quelle
Warum kann ich keine Eigenschaft wie
self.myView
anstelle einer lokalen Variablen wie myView verwenden?versuchen Sie es mit:
anstatt
self.view
quelle
Bitte beachten Sie auch, dass wir ab iOS9 mithilfe von Unterklassen der neuen Hilfsklasse NSLayoutAnchor programmgesteuert Einschränkungen definieren können, die " präziser und leichter zu lesen" sind .
Ein Beispiel aus dem Dokument:
quelle