SnapKit源码阅读(二)

上篇主要是讲约束操作中的类和协议,这篇主要讲编辑约束的类和协议。

在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
    }

约束制造编辑类图

猜你喜欢

转载自blog.csdn.net/m0_38055718/article/details/81121230