Ich versuche das seit letzter Woche herauszufinden, ohne noch einen Schritt weiter zu gehen. Ok, also muss ich einige anwenden Einschränkungen programmatisch in Swift zu einem UIView
mit diesem Code:
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);
Aber Xcode gibt diese seltsame Ausgabe zurück:
2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.
2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Können Sie mir helfen? Vielen Dank
ios
swift
uiview
autolayout
nslayoutconstraint
Sara Canducci
quelle
quelle
>
. Diesmal habe ich es für dich behoben.Antworten:
Planen Sie ein Quadrat mit
UIView
einer Breite von 100 und einer Höhe von 100 in der MitteUIView
einesUIViewController
? In diesem Fall können Sie einen der 6 folgenden Auto-Layout-Stile (Swift 5 / iOS 12.2) ausprobieren:1.
NSLayoutConstraint
Initialisierer verwenden2. Verwenden der visuellen Formatsprache
3. Verwenden einer Mischung aus
NSLayoutConstraint
Initialisierer und Visual Format Language4. Verwenden von
UIView.AutoresizingMask
Hinweis: Federn und Federbeine werden zur Laufzeit in entsprechende Einschränkungen für das automatische Layout übersetzt.
5. Verwenden
NSLayoutAnchor
6. Verwenden von
intrinsicContentSize
undNSLayoutAnchor
Ergebnis:
quelle
newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
newView.translatesAutoresizingMaskIntoConstraints = false
Teil nicht! Ich habe eine Weile gebraucht, um das zu sehen.Es hilft mir, visuell zu lernen, daher ist dies eine ergänzende Antwort.
Boilerplate-Code
Jedes der folgenden Beispiele ist unabhängig von den anderen.
Pin linke Kante
myView.leading = leadingMargin + 20
Methode 1: Ankerstil
leadingAnchor
gibt es auchtrailingAnchor
,topAnchor
undbottomAnchor
.Methode 2: NSLayoutConstraint-Stil
.leading
gibt es auch.trailing
,.top
und.bottom
..leadingMargin
gibt es auch.trailingMargin
,.topMargin
und.bottomMargin
.Breite und Höhe einstellen
width = 200
height = 100
Methode 1: Ankerstil
Methode 2: NSLayoutConstraint-Stil
Im Behälter zentrieren
myView.centerX = centerX
myView.centerY = centerY
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.myView
mich jedoch richtig in mein Testprojekt einfügen zu können, musste ich vier Einschränkungen haben.Weiterführende Literatur
quelle
leading
vs.centerX
Einschränkungen angegeben werden.addConstraint()
auf ,view
um die layoutconstraints zu machen registrieren.Wenn Sie Ihre Superansicht füllen möchten, dann schlage ich den schnellen Weg vor:
Wenn Sie ungleiche Einschränkungen benötigen, lesen Sie NSLayoutAnchor ab iOS 9. Es ist oft viel einfacher, dies direkt mit NSLayoutConstraint zu lesen:
quelle
isActive = true
ist nicht immer eine gute Idee, dies zu tun . Es ist besser und leistungsfähiger, die zugehörigen Einschränkungen in einer zu gruppieren und sie alle gleichzeitig mit zu aktivierenNSLayoutConstraint.activate
.Einschränkungen für mehrere Ansichten auf dem Spielplatz.
schnell 3+
quelle
Das Problem besteht, wie die Fehlermeldung andeutet, darin, dass Sie Einschränkungen vom Typ haben
NSAutoresizingMaskLayoutConstraints
, die mit Ihren expliziten Einschränkungen in Konflikt stehen, da diesenew_view.translatesAutoresizingMaskIntoConstraints
auf true festgelegt sind.Dies ist die Standardeinstellung für Ansichten, die Sie im Code erstellen. Sie können es folgendermaßen ausschalten:
Auch Ihre Breiten- und Höhenbeschränkungen sind seltsam. Wenn die Ansicht eine konstante Breite haben soll, ist dies der richtige Weg:
(Ersetzen Sie 100 durch die gewünschte Breite.)
Wenn Ihr Bereitstellungsziel iOS 9.0 oder höher ist, können Sie diesen kürzeren Code verwenden:
Für ein Layout wie dieses (feste Größe und zentriert in der übergeordneten Ansicht) wäre es jedoch einfacher, die Autoresizing-Maske zu verwenden und das System die Maske in Einschränkungen übersetzen zu lassen:
Beachten Sie, dass die Verwendung der automatischen Größenänderung auch dann legitim ist, wenn Sie die automatische Formatierung verwenden. (UIKit verwendet intern an vielen Stellen immer noch die automatische Größenänderung.) Das Problem besteht darin, dass es schwierig ist, zusätzliche Einschränkungen auf eine Ansicht anzuwenden, die die automatische Größenänderung verwendet.
quelle
Grundsätzlich umfasste es 3 Schritte
Dadurch wird das Label "Hallo Welt" in die Mitte des Bildschirms gestellt.
Bitte beziehen Sie sich programmgesteuert auf den Link Autolayout-Einschränkungen
quelle
Aktualisiert für Swift 3
Art der Einschränkungen
quelle
Das automatische Layout wird durch Anwenden von Einschränkungen auf Bilder realisiert. Verwenden Sie NSLayoutConstraint. Es ist möglich, auf allen Geräten ein ideales und schönes Design zu implementieren. Bitte versuchen Sie den Code unten.
quelle
In xcode 7.3.1 ist das etwas anders. das ist es, was ich mir ausgedacht habe
quelle
Ich möchte der Antwort von Imanou Petit ein theoretisches Konzept hinzufügen, damit man verstehen kann, wie das automatische Layout funktioniert.
Um das automatische Layout zu verstehen, betrachten Sie Ihre Ansicht als das Objekt von Gummi, das anfänglich verkleinert wird.
Um ein Objekt auf dem Bildschirm zu platzieren, benötigen wir 4 obligatorische Dinge:
X-Koordinate des Objekts (horizontale Position).
Y-Koordinate des Objekts (vertikale Position)
Objektbreite
Objekthöhe.
1 X-Koordinate: Es gibt mehrere Möglichkeiten, einer Ansicht x-Koordinaten zuzuweisen.
Wie z. B. führende Einschränkung, nachfolgende Einschränkung, horizontale Mitte usw.
2 Y-Koordinate: Es gibt mehrere Möglichkeiten, einer Ansicht y-Koordinaten zuzuweisen:
Wie obere Einschränkung, untere Einschränkung, vertikale Mitte usw.
3 Objektbreite: Es gibt zwei Möglichkeiten, einer Ansicht eine Breitenbeschränkung zu geben:
ein. Feste Breitenbeschränkung hinzufügen (Betrachten Sie diese Beschränkung als Eisenstange mit fester Breite, und Sie haben das Gummiobjekt horizontal damit eingehakt, damit das Gummiobjekt nicht schrumpft oder sich ausdehnt.)
b. Fügen Sie keine Breitenbeschränkung hinzu, sondern fügen Sie eine x-Koordinatenbeschränkung sowohl für das Ende der Ansicht als auch für das Führen hinzu. Diese beiden Einschränkungen erweitern / verkleinern das Objekt Ihres Gummis, indem Sie es von beiden Enden, dem Führen und dem Schleppen, ziehen / drücken.
4 Objekthöhe: Ähnlich wie bei der Breite gibt es zwei Möglichkeiten, einer Ansicht eine Höhenbeschränkung zu geben:
ein. Feste Höhenbeschränkung hinzufügen (Betrachten Sie diese Einschränkungen als Eisenstange mit fester Höhe, und Sie haben das Objekt Ihres Gummis vertikal damit eingehakt, damit das Objekt des Gummis nicht schrumpft oder sich ausdehnt.)
b. Fügen Sie keine Höhenbeschränkung hinzu, sondern fügen Sie oben und unten eine x-Koordinatenbeschränkung für beide Enden der Ansicht hinzu. Diese beiden Einschränkungen erweitern / verkleinern das Objekt Ihres Gummis, indem Sie es von beiden Seiten, oben und unten ziehen / drücken.
quelle
quelle
Dies ist eine Möglichkeit, programmgesteuert Einschränkungen hinzuzufügen
quelle
Sie fügen alle definierten Einschränkungen hinzu,
self.view
die falsch sind, da die Einschränkung für Breite und Höhe zu Ihrer hinzugefügt werden solltenewView
.Soweit ich weiß, möchten Sie außerdem eine konstante Breite und Höhe von 100: 100 einstellen. In diesem Fall sollten Sie Ihren Code ändern in:
quelle
Wenn Sie das oben genannte hässlich finden. Sie sollten die Verwendung eines DSL für Einschränkungen in Betracht ziehen. Mit SnapKit wird die Constraint-API wesentlich benutzerfreundlicher
quelle
Wir können dies leicht mit Swift 5.1 tun
Setup 1
Unteransicht Breite Höhe mit Float eingestellt
Setup 2
Unteransichtsbreite wird mithilfe der Ansichtsbreitenhöhe festgelegt
quelle
Probieren Sie diese elegante
UIView
Erweiterung für Einschränkungen aus. Sie können Einschränkungen einfach wie folgt vornehmen:Hier ist die Erweiterung, kopieren Sie sie einfach in Ihr Projekt.
quelle