使用可视格式语言的“宽度等于高度”约束

时间:2017-12-01 13:40:26

标签: ios autolayout nslayoutconstraint visual-format-language

为了将宽度等于其超视图高度,我们可以执行以下操作

.env

或者我们可以从界面构建器

执行此操作

enter image description here

但是如何使用VFL做同样的事情呢?

3 个答案:

答案 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