Derzeit ist es nicht möglich, eine Ansicht in der Übersicht nur mit VFL zu zentrieren . Es ist jedoch nicht so schwierig, dies mit einer einzelnen VFL-Zeichenfolge und einer einzelnen zusätzlichen Einschränkung (pro Achse) zu tun:
VFL: "|-(>=20)-[view]-(>=20)-|"
[NSLayoutConstraint constraintWithItem:view
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:view.superview
attribute:NSLayoutAttributeCenterX
multiplier:1.f constant:0.f];
Man würde denken, dass Sie dies einfach tun könnten (was ich ursprünglich gedacht und versucht habe, als ich diese Frage sah):
[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>=20)-[view(==200)]-(>=20)-|"
options: NSLayoutFormatAlignAllCenterX | NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"view" : view}];
Ich habe viele verschiedene Variationen der oben genannten versucht, um sie meinem Willen anzupassen, aber dies scheint nicht auf die Übersicht zuzutreffen, selbst wenn explizit zwei separate VFL-Zeichenfolgen für beide Achsen vorhanden sind ( H:|V:
). Ich fing dann an, genau zu isolieren, wann die Optionen es tun auf den VFL erhalten angewandt. Sie scheinen nicht für die Übersicht in der VFL zu gelten und gelten nur für explizite Ansichten, die in der VFL-Zeichenfolge erwähnt werden (was in bestimmten Fällen enttäuschend ist).
Ich hoffe, dass Apple in Zukunft eine neue Option hinzufügt, damit die VFL-Optionen die Übersicht berücksichtigen, auch wenn dies nur dann der Fall ist, wenn es neben der Übersicht in der VFL nur eine einzige explizite Ansicht gibt. Eine andere Lösung könnte eine andere Option sein, die an die VFL übergeben wird und etwa Folgendes sagt:NSLayoutFormatOptionIncludeSuperview
.
Unnötig zu erwähnen, dass ich viel über VFL gelernt habe, um diese Frage zu beantworten.
|
und[superview]
als separate interne Entitäten behandelt, obwohl sie dasselbe semantische Objekt darstellen. Durch die Verwendung von[superview]
Autolayout wird das Superview-Objekt in seine Ausrichtungsmetriken einbezogen (in dem Fall in seiner Antwort auf den Github-Link ist es dieNSLayoutFormatAlignAllCenterY
/ -MetrikX
).Ja, es ist möglich, eine Ansicht in ihrer Übersicht mit Visual Format Language zu zentrieren. Sowohl vertikal als auch horizontal. Hier ist die Demo:
https://github.com/evgenyneu/center-vfl
quelle
Ich denke, es ist besser, Einschränkungen manuell zu erstellen.
Jetzt können wir NSLayoutAnchor verwenden , um AutoLayout programmgesteuert zu definieren:
(Verfügbar in iOS 9.0 und höher)
Ich empfehle die Verwendung von SnapKit , einem DSL, um das automatische Layout sowohl für iOS als auch für MacOS zu vereinfachen.
quelle
Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead.
Absolut möglich war das so:
Habe das von hier gelernt . Der Code über der Mitte zeigt offensichtlich die Unteransicht von Y.
Swift3:
quelle
Fügen Sie den folgenden Code hinzu und platzieren Sie Ihre Schaltfläche in der Mitte des Bildschirms. Absolut möglich.
quelle
Ich weiß, dass du es nicht willst, aber du kannst natürlich die Ränder berechnen und sie verwenden, um die visuelle Formatzeichenfolge zu erstellen;)
Wie auch immer, nein. Leider ist es mit VFL nicht möglich, dies "automatisch" zu tun - zumindest noch nicht.
quelle
Dank der Antwort von @Evgenii erstelle ich ein vollständiges Beispiel im Kern:
Zentrieren Sie das rote Quadrat vertikal mit der benutzerdefinierten Höhe
https://gist.github.com/yallenh/9fc2104b719742ae51384ed95dcaf626
Sie können eine Ansicht vertikal zentrieren, indem Sie entweder VFL (was nicht ganz intuitiv ist) verwenden oder Einschränkungen manuell verwenden. Übrigens kann ich in VFL nicht sowohl centerY als auch height wie folgt kombinieren:
In der aktuellen Lösung werden VFL-Einschränkungen separat hinzugefügt.
quelle
Was getan werden muss, ist, dass die Übersicht im Wörterbuch deklariert werden sollte. Anstatt zu verwenden, verwenden
|
Sie@{@"super": view.superview};
.Und
NSLayoutFormatAlignAllCenterX
für vertikal undNSLayoutFormatAlignAllCenterY
für horizontal als Optionen.quelle
Sie können zusätzliche Ansichten verwenden.
Wenn du es ordentlich willst, dann
centerXView.hidden = centerYView.hidden = YES;
.PS: Ich bin nicht sicher, ob ich die zusätzlichen Ansichten "Platzhalter" nennen kann, da Englisch meine zweite Sprache ist. Es wird geschätzt, wenn mir jemand das sagen kann.
quelle
Für diejenigen, die wegen einer
Interface Builder
basierten Lösung hierher gekommen sind (Google führt mich hierher), fügen Sie einfach konstante Einschränkungen für Breite und Höhe hinzu und wählen Sie die Unteransicht -> ziehen Sie die Steuerung in die Übersicht -> wählen Sie "Vertikal / horizontal in der Übersicht zentrieren".quelle
Das ist meine Methode
quelle
Ich muss nur sagen, dass Sie dies anstelle von Einschränkungen verwenden können:
quelle
@ igor-muzyka Antwort in Swift 2 :
quelle
Anstatt VFL zu verwenden, können Sie dies einfach im Interface Builder tun. Klicken Sie im Haupt-Storyboard bei gedrückter Strg-Taste auf die Ansicht, die Sie zentrieren möchten. Ziehen Sie in die Übersicht (bei gedrückter Strg-Taste) und wählen Sie "Mitte X" oder "Mitte Y". Kein Code notwendig.
quelle