上篇主要是讲约束操作中的类和协议,这篇主要讲编辑约束的类和协议。
在ConstraintMaker中有一系列的ConstraintMakerExtendable类型属性,描述视图的位置,如下:
// 左边距
public var left: ConstraintMakerExtendable {
return self.makeExtendableWithAttributes(.left)
}
// 调用ConstraintMaker中的方法
internal func makeExtendableWithAttributes(_ attributes: ConstraintAttributes) -> ConstraintMakerExtendable {
// 初始化description
let description = ConstraintDescription(item: self.item, attributes: attributes)
// 添加到descriptions数组中
self.descriptions.append(description)
return ConstraintMakerExtendable(description)
}
ConstraintMakerExtendable
约束制造扩展类,继承自ConstraintMakerRelatable
类型。一系列的ConstraintMakerExtendable类型属性,描述视图的位置。
// 添加到description中,并返回自身。
public var left: ConstraintMakerExtendable {
self.description.attributes += .left
return self
}
ConstraintMakerRelatable
约束制造器关联类,持有ConstraintDescription
约束描述类。描述约束属性和约束依赖目标之间的关系。返回ConstraintMakerEditable
约束制造可编辑类。
internal func relatedTo(_ other: ConstraintRelatableTarget, relation: ConstraintRelation, file: String, line: UInt) -> ConstraintMakerEditable {
let related: ConstraintItem // 约束元素
let constant: ConstraintConstantTarget // 约束常量
// 类型为ConstraintItem
if let other = other as? ConstraintItem {
guard other.attributes == ConstraintAttributes.none ||
other.attributes.layoutAttributes.count <= 1 ||
other.attributes.layoutAttributes == self.description.attributes.layoutAttributes ||
other.attributes == .edges && self.description.attributes == .margins ||
other.attributes == .margins && self.description.attributes == .edges else {
fatalError("Cannot constraint to multiple non identical attributes. (\(file), \(line))");
}
related = other
constant = 0.0
} else if let other = other as? ConstraintView { // 类型为view
related = ConstraintItem(target: other, attributes: ConstraintAttributes.none)
constant = 0.0
} else if let other = other as? ConstraintConstantTarget { // 类型为数值类
related = ConstraintItem(target: nil, attributes: ConstraintAttributes.none)
constant = other // 常量为这个值
} else if #available(iOS 9.0, OSX 10.11, *), let other = other as? ConstraintLayoutGuide {
related = ConstraintItem(target: other, attributes: ConstraintAttributes.none)
constant = 0.0
} else {
fatalError("Invalid constraint. (\(file), \(line))")
}
// 根据description构建ConstraintMakerEditable
let editable = ConstraintMakerEditable(self.description)
// 设置属性
editable.description.sourceLocation = (file, line) // 文件地址
editable.description.relation = relation // 关系
editable.description.related = related // 依赖对象
editable.description.constant = constant // 常量
return editable
}
其中,ConstraintRelatableTarget
协议, 约束依赖目标协议,数值类型,ConstraintInsets,ConstraintItem,ConstraintView,ConstraintLayoutGuide都实现此协议。
ConstraintMakerEditable
约束制造器编辑类,继承自ConstraintMakerPriortizable
,主要设置倍数、偏移量和内边距的类型。添加到ConstraintDescription
约束描述类,并返回自身。
@discardableResult
public func multipliedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable {
// 添到description的multiplier倍数里 ,数值
self.description.multiplier = amount
return self
}
其中,ConstraintMultiplierTarget
协议,约束倍数 Int ,UInt,Float,Double,CGFloat都实现此协议,实现协议constraintMultiplierTargetValue: CGFloat
属性(强制转换)
ConstraintMakerPriortizable
约束制造器优先级类,设置约束的优先级。继承自ConstraintMakerFinalizable
。
/// 设置约束优先级
@discardableResult
public func priority(_ amount: ConstraintPriority) -> ConstraintMakerFinalizable {
// 添加到description的优先级中,提供ConstraintPriority的值
self.description.priority = amount.value
return self
}
/// 设置优先级使用ConstraintPriorityTarget的实例
@discardableResult
public func priority(_ amount: ConstraintPriorityTarget) -> ConstraintMakerFinalizable {
self.description.priority = amount
return self
}
ConstraintPriority
约束优先级结构体,持有value值。设置默认优先级值。ConstraintPriorityTarget
约束优先级协议,Int,UInt,Float,Double,CGFloat,UILayoutPriority都实现此协议constraintPriorityTargetValue
属性。
ConstraintMakerFinalizable
约束制造器最终类,持有ConstraintDescription
约束描述类。同时设置标签。
internal init(_ description: ConstraintDescription) {
self.description = description
}