谈一谈苹果原生的布局框架 NSLayoutConstraint 和 VFL

来源:互联网 发布:3d平面设计软件 编辑:程序博客网 时间:2024/05/24 00:41

用多了 Masonry 、Snapkit 等第三方框架,自然体会了其中的方便之处,实际上,苹果本身也有自身的自动布局框架,这次来谈谈 NSLayoutConstraint 和 VFL 两种原生自动布局框架。当然,如果对 Masonry 感兴趣,也可直接点击传送门:浅谈 Masonry 布局框架

实际上,Masonry 就是对系统原生 NSLayoutConstraint 进行封装的第三方自动布局框架。

废话不多说,直接进入正题(采用最新的 swift3.1 讲解)

NSLayoutConstraint

public convenience init(item view1: Any,                    attribute attr1: NSLayoutAttribute,                    relatedBy relation: NSLayoutRelation,                      toItem view2: Any?,                       attribute attr2: NSLayoutAttribute,                      multiplier: CGFloat,                      constant c: CGFloat)

构造函数参数说明:

NSLayoutConstraint(item: 视图,                    attribute: 约束属性,                    relatedBy: 约束关系,                      toItem: 参照视图,                       attribute: 参照属性,                      multiplier: 乘积,                      constant: 约束数值)

如果指定 宽、高 约束,则:
1. 参照视图设置为nil;
2. 参照属性选择 .notAnAttribute 。

NSLayoutConstraint 的布局方式可以简单得总结为一个公式:

view1.attr1 = view2.attr2 * multiplier + constant

下面给出代码实例,具体功能不详细说了,比较容易懂:

addConstraints([NSLayoutConstraint(item: tipLabel,                                           attribute: .centerX,                                           relatedBy: .equal,                                           toItem: iconView,                                           attribute: .centerX,                                           multiplier: 1.0,                                           constant: 0)])        addConstraints([NSLayoutConstraint(item: tipLabel,                                           attribute: .top,                                           relatedBy: .equal,                                           toItem: iconView,                                           attribute: .bottom,                                           multiplier: 1.0,                                           constant: 20)])        addConstraints([NSLayoutConstraint(item: tipLabel,                                           attribute: .width,                                           relatedBy: .equal,                                           toItem: nil,                                           attribute: .notAnAttribute,                                           multiplier: 1.0,                                           constant: 236)])

VFL 可视化格式语言

open class func constraints(withVisualFormat format: String,                             options opts: NSLayoutFormatOptions = [],                             metrics: [String : Any]?,                              views: [String : Any]) -> [NSLayoutConstraint]

参数说明:

open class func constraints(withVisualFormat:VLF公式,                             options :[],                             metrics: 约束数值 [String:数值],                              views: 视图字典 [String:子视图]

VFL 可视化格式语言简要说明:
H:水平方向
V:垂直方向
| :边界
[]:包含控件的名称字符串,对应关系在 views 字典中定义
():定义控件的宽/高,可以在 metrics 中指定

注意点:VFL 通常用于连续参照关系,如果遇到居中对齐,通常直接使用参照。

来一段示例代码:

// views:定义VFL中的控件名称和实际名称映射关系        // metrics:定义VFL中()指定的常数映射关系        let viewDict:[String:Any] = ["maskIconView":maskIconView,                        "registerButton":registerButton]        let metrics = ["spacing":-20]        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[maskIconView]-0-|",                                                      options: [],                                                      metrics: nil,                                                      views: viewDict))        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[maskIconView]-(spacing)-[registerButton]",                                                      options: [],                                                      metrics: metrics,                                                      views: viewDict))
原创粉丝点击