是的,效果一样
greenView.snp.makeConstraints { make in
make.right.width.centerX.centerY.equalTo(view).offset(-20)
make.height.equalTo(130)
}
等于
greenView.snp.makeConstraints { make in
make.right.equalTo(view).offset(-20)
make.width.equalTo(view).offset(-20)
make.center.equalTo(view).offset(-20)
make.height.equalTo(130)
}
可以从源码中阅读
这个过程分为两部分,
设置数据,然后激活布局约束
-
make.right.width.centerX.centerY.equalTo(view).offset(-20)的设置数据部分
make.right 创建一个ConstraintMakerExtendable
public var right: ConstraintMakerExtendable {
return self.makeExtendableWithAttributes(.right)
}
通话
internal func makeExtendableWithAttributes(_ attributes: ConstraintAttributes) -> ConstraintMakerExtendable {
let description = ConstraintDescription(item: self.item, attributes: attributes)
self.descriptions.append(description)
return ConstraintMakerExtendable(description)
}
make.right.width,表示ConstraintMakerExtendable的description.attributes加一个宽度ConstraintAttributes
public var width: ConstraintMakerExtendable {
self.description.attributes += .width
return self
}
最后的.offset(-20),表示ConstraintMakerExtendable的偏移量已设置
@discardableResult
public func offset(_ amount: ConstraintOffsetTarget) -> ConstraintMakerEditable {
self.description.constant = amount.constraintOffsetTargetValue
return self
}
-
make.right.width.centerX.centerY.equalTo(view).offset(-20)的活动布局约束部分
makeConstraints{ make in }的实现
internal static func makeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {
// prepare the layout constraints
let constraints = prepareConstraints(item: item, closure: closure)
// active the layout constraints
for constraint in constraints {
constraint.activateIfNeeded(updatingExisting: false)
}
}
准备布局约束
重点是description.constraint
internal static func prepareConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {
let maker = ConstraintMaker(item: item)
closure(maker)
var constraints: [Constraint] = []
for description in maker.descriptions {
// the key point
guard let constraint = description.constraint else {
continue
}
constraints.append(constraint)
}
return constraints
}
description.constraint 初始化布局约束
class Constraint 有一个属性layoutConstraints,它属于[LayoutConstraint]。
LayoutConstraint 继承自 NSLayoutConstraint
这里是描述的偏移量
internal lazy var constraint: Constraint? = {
guard let relation = self.relation,
let related = self.related,
let sourceLocation = self.sourceLocation else {
return nil
}
let from = ConstraintItem(target: self.item, attributes: self.attributes)
return Constraint(
from: from,
to: related,
relation: relation,
sourceLocation: sourceLocation,
label: self.label,
multiplier: self.multiplier,
constant: self.constant, // here it is
priority: self.priority
)
}()
三个ConstraintMakerExtendable具有相同的偏移描述