Хитрость заключается в том, чтобы использовать несколько визуальных ограничений, чтобы расположить все вертикально и горизонтально. Вы можете объединить все три вида вместе в одно вертикальное ограничение, потому что все они выстроены в ряд, но для горизонтальных ограничений вам понадобится одно для каждой строки (итого три).
Вам нужно будет указать высоту элементов в визуальном ограничении, чтобы все выровнялось
Вот пример кода:
let name = UITextField(frame: CGRect())
name.text = "Name"
name.translatesAutoresizingMaskIntoConstraints = false
name.backgroundColor = UIColor.red
let colorName = UITextField(frame: CGRect())
colorName.text = "ColorName"
colorName.translatesAutoresizingMaskIntoConstraints = false
colorName.backgroundColor = UIColor.gray
let description = UITextField(frame: CGRect())
description.text = "Description"
description.translatesAutoresizingMaskIntoConstraints = false
description.backgroundColor = UIColor.green
view.addSubview(name)
view.addSubview(colorName)
view.addSubview(description)
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-(10)-[name]", options: [], metrics: nil, views: ["name": name]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[colorName]-(10)-|", options: [], metrics: nil, views: ["colorName": colorName]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-(10)-[description]", options: [], metrics: nil, views: ["description": description]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-(50)-[name]-(10)-[colorName]-(10)-[description]", options: [], metrics: nil, views: ["name": name, "colorName": colorName, "description": description]))
Для ограничения по вертикали я использовал отступ 50 сверху и 10 точек между каждым объектом. Очевидно, вы можете установить их на то, что вы хотите.