SnapKit 源码阅读笔记

2018-01-06  本文已影响0人  樂亦leeyii

Basic Information

Note

Constraint.swift

class Constraint

一个实例对象由一个maker语句生成.

    view1.snp.makeConstraints { (maker) in
        maker.edges.equalToSuperview()
    }

生成一个Constraint对象,但是layoutConstraints有4个约束.

    view1.snp.makeConstraints { (maker) in
        maker.top.equalToSuperview()
        maker.left.equalToSuperview()
        maker.bottom.equalToSuperview()
        maker.right.equalToSuperview()
    }

生成4个Constraint对象,每个对象中分别有一个约束.所有两种写法是相同的.
但是第一种写法共用一个multiplier,constant,priority.如果这三个值不相同的话就需要使用第二种写法了.

let layoutFromAttributes = self.from.attributes.layoutAttributes
for layoutFromAttribute in layoutFromAttributes {
        // ... 省略部分代码
        // create layout constraint
        let layoutConstraint = LayoutConstraint(
            item: layoutFrom,
            attribute: layoutFromAttribute,
            relatedBy: layoutRelation,
            toItem: layoutTo,
            attribute: layoutToAttribute,
            multiplier: self.multiplier.constraintMultiplierTargetValue,
            constant: layoutConstant
        )

        // append
        self.layoutConstraints.append(layoutConstraint)
    }

每个Constraint对象layoutConstraints的个数由form.attributes.layoutAttributes的数量决定.

这里的LayoutConstraintNSLayoutConstraint的子类.

从约束添加的view上找到所有的约束,一一比较attribute是否相同,如果没有相同的抛出异常.

ConstraintPriority.swift

ConstraintInsets.swift

ConstraintAttributes.swift

Targets

    public protocol ConstraintRelatableTarget {
    }
    
    extension Int: ConstraintRelatableTarget {
    }
    
    extension UInt: ConstraintRelatableTarget {
    }
    
    extension Float: ConstraintRelatableTarget {
    }
    
    extension Double: ConstraintRelatableTarget {
    }
    
    extension CGFloat: ConstraintRelatableTarget {
    }
    
    extension CGSize: ConstraintRelatableTarget {
    }
    
    extension CGPoint: ConstraintRelatableTarget {
    }
    
    extension ConstraintInsets: ConstraintRelatableTarget {
    }
    
    extension ConstraintItem: ConstraintRelatableTarget {
    }
    
    extension ConstraintView: ConstraintRelatableTarget {
    }
    
    @available(iOS 9.0, OSX 10.11, *)
    extension ConstraintLayoutGuide: ConstraintRelatableTarget {
    }

Maker

    // multipliedBy() -> ConstraintMakerEditable
    // offset() -> ConstraintMakerEditable
    // priority() -> ConstraintMakerPriortizable
    // labeled() -> ConstraintMakerFinalizable
    maker.top.equalToSuperview().multipliedBy(0.5).offset(10).priority(.required).labeled("label")

子类可以调用父类的方法,但是父类不能调用子类的方法.   

上面的链式语法通过这样的方式显示使用者调用规范.

    maker.top.equalToSuperview().offset(10).priority(.required).labeled("label").multipliedBy(05)
    // compile error
上一篇 下一篇

猜你喜欢

热点阅读