TABSwiftLayout
它是做什么的?
一个库,提供一个灵活但非常简单的API,以编程方式处理AutoLayout。
为什么我会用它?
使用标准Apple API非常麻烦。即使是像约束视图宽度这样简单的事情
let constraint = NSLayoutConstraint(item: view, attribute: .width, relatedBy: .equal, toItem: view, attribute: .width, multiplier: 1, constant: 100)
NSLayoutConstraint.activateConstraints([constraint])
现在有了SwiftLayout
view.size(.horizontal, relatedBy: .equal, size: 100)
如您所见,SwiftLayout还消除了您激活约束的需求,并消除了Apple API中所需的重叠性。
我能用它做什么?
目前所有最常用的布局任务都可以用SwiftLayout来完成。
位置
view.pin(edge: .top, toEdge: .top, ofView: view.superview) // default margin 0
view.pin(edge: .top, toEdge: .top, ofView: view.superview, margin: 15)
view.pin(edges: [.left, .right], ofView: view.superview) // default margins (0, 0, 0, 0)
view.pin(edges: [.left, .right], ofView: view.superview, margins: EdgeMargins(top: 0, left: 15, bottom: 0, right: 15))
尺寸
view.size(axis: .horizontal, ofViews: [view]) // default ratio 1.0
view.size(axis: .horizontal, ofViews: [view], ratio: 1.5)
view.size(axis: .horizontal, relatedBy: .equal, size: 100)
view.size(axis: .horizontal, relativeTo: .horizontal, ofView: view.superview) // default ratio 1.0
view.size(axis: .horizontal, relativeTo: .horizontal, ofView: view.superview, ratio: 0.5)
对齐(便利方法)
view.alignTop(toView: otherView)
view.alignBottom(toView: otherView)
view.alignLeft(toView: otherView)
view.alignRight(toView: otherView)
view.alignHorizontally(toView: otherView)
view.alignVertically(toView: otherView)
注意事项
与Apple的API一样,您必须确保您的视图已在superview中添加,然后再为其设置任何约束。然而,在SwiftLayout中,在这种情况下不会添加约束,并且一个友好的print()消息会指出您已经犯了错误。
附加API
SwiftLayout还包括一组额外的API,用于检查当前应用于视图的约束类型。
let constraints = view.viewConstraints
此API与Apple的实现略有不同,因为它将自动扫描superview,以返回应用于此视图的当前所有约束。
let constraints = view.constraints(forTrait: .leftMargin)
这对于需要调整常量或完全替换特定约束非常有用。更好的是,这是一个位掩码,因此您可以一次请求多个约束;)
if view.contains(trait: [.leftMargin, .rightMargin]) {
...
}
最后,您还可以检查视图,以确定它是否包含特定的布局特性集。