Ограничение «Ширина равна высоте» с использованием языка визуального формата

Чтобы добавить ширину, равную высоте супервизора, мы можем сделать следующее:

NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: view.superview, attribute: .height, multiplier: 1, constant: 0)

или мы можем сделать это из конструктора интерфейсов

введите здесь описание изображения

Но как я могу сделать то же самое с помощью VFL?


person Tapas Pal    schedule 01.12.2017    source источник


Ответы (3)



Я не думаю, что вы можете, так как это довольно необычная установка. В подобных эзотерических случаях использования лучше всего использовать явный инициализатор в NSLayoutConstraint.

person Charles Srstka    schedule 01.12.2017

Как уже упоминалось, в Документах указано, что вы не можете устанавливать определенные (общие) ограничения с помощью VFL. Вот простой пример добавления всего одной дополнительной строки, чтобы получить то, что вы хотите.

Вы можете запустить это на игровой площадке:

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
person DonMag    schedule 01.12.2017