Project6-AutoLayoutConstraint, A

2016-09-27  本文已影响0人  终极解码者

1.VFL(Visual Format Language)

let viewsDictionary = ["label1": label1, "label2": label2, "label3": label3, "label4": label4, "label5": label5]

for label in viewsDictionary.keys {
     view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[\(label)]-|", options: [], metrics: nil, views: viewsDictionary))
}
let metrics = ["labelHeight":88]
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[label1(labelHeight@999)]-[label2(label1)]-[label3(label1)]-[label4(label1)]-[label5(label1)]-(>=10)-|", options: [], metrics: metrics, views: viewsDictionary))

先定义一个字典,将要布局的对象和他的字符串对应起来,因为在 VisualFormat这个参数中是要用字符串来表示控件的。

@数字, 代表这个约束的优先级,默认是1000,代表必须按照这个约束规定的来。[label1(labelHeight@999)]说明label的高度为labelHeight,优先级为999,比1000小,后面的4个标签的高度都按照label1的高度和优先级来,这样一来,就相当于5个标签在他们的父视图的垂直方向是等分父视图的高度的。

2.Ancher
在ios9.0以后,新增加了这几个属性

extension UIView {

    /* Constraint creation conveniences. See NSLayoutAnchor.h for details.
     */
    open var leadingAnchor: NSLayoutXAxisAnchor { get }
    open var trailingAnchor: NSLayoutXAxisAnchor { get }
    open var leftAnchor: NSLayoutXAxisAnchor { get }
    open var rightAnchor: NSLayoutXAxisAnchor { get }
    open var topAnchor: NSLayoutYAxisAnchor { get }
    open var bottomAnchor: NSLayoutYAxisAnchor { get }
    open var widthAnchor: NSLayoutDimension { get }
    open var heightAnchor: NSLayoutDimension { get }
    open var centerXAnchor: NSLayoutXAxisAnchor { get }
    open var centerYAnchor: NSLayoutYAxisAnchor { get }
    open var firstBaselineAnchor: NSLayoutYAxisAnchor { get }
    open var lastBaselineAnchor: NSLayoutYAxisAnchor { get }
}

可以利用这些属性来布局和约束控件。

var previous: UILabel!
    for label in [label1, label2, label3, label4, label5] {
        label.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
        label.heightAnchor.constraint(equalToConstant: 88).isActive = true      
        if previous != nil {
            label.topAnchor.constraint(equalTo: previous.bottomAnchor).isActive = true
        }
        previous = label
    }
上一篇下一篇

猜你喜欢

热点阅读