答案 0 :(得分:1)
来自Auto Layout Guide: Visual Format Language
的文档符号表示对完整性的良好可视化 表达性。大多数在真实用户中有用的约束 接口可以使用可视格式语法表达,但也有 一些不能。一个无法表达的有用约束是a 固定宽高比(例如,imageView.width = 2 * imageView.height)。要创建此类约束,必须使用
constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
。
"宽度等于高度"是一个比率(为1)。所以这是不可能的。
答案 1 :(得分:0)
我认为你不能,因为这是一个非常罕见的设置。像这样的深奥用例是在NSLayoutConstraint上使用显式初始化器的最佳位置。
答案 2 :(得分:0)
如前所述,Docs指出您无法使用VFL设置某些(常见)约束。以下是添加一个附加行以获得所需内容的简单示例。
您可以在Playground中运行:
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