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 einfach init
.
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:
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[myView(>=748)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
[self.view addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:[myView(==200)]-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:NSDictionaryOfVariableBindings(myView)]];
Die verbale Beschreibung dieses Layouts lautet wie folgt, beginnend mit der vertikalen Einschränkung:
myView füllt die Höhe seiner Übersicht mit einer oberen und unteren Polsterung, die dem Standardbereich entspricht. Die Übersicht von myView hat eine Mindesthöhe von 748 Punkten. Die Breite von myView beträgt 200 Punkte und die rechte Auffüllung entspricht dem Standardbereich gegenüber der Übersicht.
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 verwenden self.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 verwenden valueForKeyPath:
. Eine ähnliche Frage und Antwort finden Sie hier .