Wie bereits erwähnt, weisen die Docs darauf hin, dass Sie mit VFL bestimmte (allgemeine) Constraints nicht setzen können. Hier ist ein einfaches Beispiel für das Hinzufügen nur eine zusätzliche Zeile, um zu bekommen, was Sie wollen.
Sie können dies in einem Spielplatz laufen:
import UIKit
import PlaygroundSupport
class TestVC: UIViewController {
let squareView: UIView = {
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
v.backgroundColor = .green
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .yellow
// add the subview
view.addSubview(squareView)
//Views to add constraints to
let views = Dictionary(dictionaryLiteral: ("sqV", squareView))
// 40 points from left, width of 100
let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:|-40-[sqV(==100)]", options: [], metrics: nil, views: views)
view.addConstraints(horizontalConstraints)
// 40 points from top, no height setting
let verticalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "V:|-40-[sqV]", options: [], metrics: nil, views: views)
view.addConstraints(verticalConstraints)
// set height equal to width (1:1 ratio)
squareView.heightAnchor.constraint(equalTo: squareView.widthAnchor, multiplier: 1.0).isActive = true
}
}
let vc = TestVC()
PlaygroundPage.current.liveView = vc