Wenn jemand nach einer Swift-Lösung sucht, würde ich eine Swift- ErweiterungUIView
erstellen, die Ihnen jedes Mal hilft, wenn Sie einen Subviews-Frame an seine Superviews-Grenzen binden möchten:
Swift 2:
extension UIView {
/// Adds constraints to this `UIView` instances `superview` object to make sure this always has the same size as the superview.
/// Please note that this has no effect if its `superview` is `nil` – add this `UIView` instance as a subview before calling this.
func bindFrameToSuperviewBounds() {
guard let superview = self.superview else {
print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.")
return
}
self.translatesAutoresizingMaskIntoConstraints = false
superview.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[subview]-0-|", options: .DirectionLeadingToTrailing, metrics: nil, views: ["subview": self]))
superview.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[subview]-0-|", options: .DirectionLeadingToTrailing, metrics: nil, views: ["subview": self]))
}
}
Swift 3:
extension UIView {
/// Adds constraints to this `UIView` instances `superview` object to make sure this always has the same size as the superview.
/// Please note that this has no effect if its `superview` is `nil` – add this `UIView` instance as a subview before calling this.
func bindFrameToSuperviewBounds() {
guard let superview = self.superview else {
print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.")
return
}
self.translatesAutoresizingMaskIntoConstraints = false
superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self]))
superview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[subview]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["subview": self]))
}
}
Swift 4.2:
extension UIView {
/// Adds constraints to this `UIView` instances `superview` object to make sure this always has the same size as the superview.
/// Please note that this has no effect if its `superview` is `nil` – add this `UIView` instance as a subview before calling this.
func bindFrameToSuperviewBounds() {
guard let superview = self.superview else {
print("Error! `superview` was nil – call `addSubview(view: UIView)` before calling `bindFrameToSuperviewBounds()` to fix this.")
return
}
self.translatesAutoresizingMaskIntoConstraints = false
self.topAnchor.constraint(equalTo: superview.topAnchor, constant: 0).isActive = true
self.bottomAnchor.constraint(equalTo: superview.bottomAnchor, constant: 0).isActive = true
self.leadingAnchor.constraint(equalTo: superview.leadingAnchor, constant: 0).isActive = true
self.trailingAnchor.constraint(equalTo: superview.trailingAnchor, constant: 0).isActive = true
}
}
Dann nenne es einfach so :
// after adding as a subview, e.g. `view.addSubview(subview)`
subview.bindFrameToSuperviewBounds()
constant: 0
Teil entfernen .Ich bin mir nicht sicher, ob dies der effizienteste Weg ist, aber es funktioniert.
quelle
NSLayoutConstraint.activateConstraints([width, height, top, leading])
[coverForScrolView addConstraints:@[width, height, top, leading]];
Dieser Link kann Ihnen helfen, folgen Sie den Anweisungen: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2
EDIT:
Verwenden Sie das folgende Code-Snippet, wobei die Unteransicht Ihr Subivew ist.
quelle
V:|[subview]|
undH:|[subview]|
addConstraint
undremoveConstraint
Methoden für UIView werden veraltet sein, daher lohnt es sich, die Funktionen zur Erstellung von Einschränkungen zu verwenden:quelle
constant: 0
Teil entfernen .Ansatz 1: Über die UIView-Erweiterung
Hier ist ein funktionalerer Ansatz in Swift 3+ mit einer Vorbedingung anstelle einer
print
(die in der Konsole leicht zugrunde gehen kann). Dieser meldet Programmiererfehler als fehlgeschlagene Builds.Fügen Sie diese Erweiterung Ihrem Projekt hinzu:
Nennen Sie es jetzt einfach so:
Beachten Sie, dass die obige Methode bereits in mein HandyUIKit- Framework integriert ist, das Ihrem Projekt auch einige weitere praktische UI-Helfer hinzufügt.
Ansatz 2: Verwenden eines Frameworks
Wenn Sie in Ihrem Projekt viel mit programmatischen Einschränkungen arbeiten, empfehle ich Ihnen, SnapKit zu testen . Dies erleichtert das Arbeiten mit Einschränkungen erheblich und ist weniger fehleranfällig .
Befolgen Sie die Installationsanweisungen in den Dokumenten, um SnapKit in Ihr Projekt aufzunehmen. Dann importiert es an der Spitze der Swift - Datei:
Jetzt können Sie genau das Gleiche erreichen:
quelle
Swift 3:
quelle
Swift 4 mit
NSLayoutConstraint
:quelle
Als ergänzende Antwort und eine Antwort für diejenigen, die nicht gegen die Einbeziehung von Bibliotheken von Drittanbietern sind, bietet die PureLayout- Bibliothek eine Methode, um genau dies zu tun. Sobald die Bibliothek installiert ist, ist es so einfach wie
Es gibt andere Bibliotheken, die je nach Geschmack ähnliche Funktionen bieten können, z. Mauerwerk , Kartographie .
quelle
Im Anschluss an die Lösung von @ Dschee finden Sie hier eine schnelle 3.0-Syntax: (Bitte beachten Sie: Dies ist nicht meine Lösung , ich habe sie gerade für Swift 3.0 behoben.)
quelle
Ich musste die Übersicht vollständig abdecken. Die anderen würden das bei Orientierungsänderungen nicht tun. Also habe ich eine neue geschrieben, die dies tut - mit einem beliebigen Größenmultiplikator von 20. Sie können jederzeit auf Ihre Bedürfnisse eingehen. Beachten Sie auch, dass diese Ansicht die Unteransicht viel größer macht als die Übersicht, was sich möglicherweise von den Anforderungen unterscheidet.
quelle
Ich habe die besten Elemente aus den anderen Antworten ausgewählt:
Sie können es beispielsweise in Ihrer benutzerdefinierten UIView folgendermaßen verwenden:
quelle