源码结构
1 约束条件的封装
2 样式的封装
3 控件常用方法的封装
整体思路
1 每个方法都都将加入的新的view添加到当前的数组中然后返回,最后结果就是方法会返回涉及到的全部views
2 对操作符进行了大量的自定义简化了操作
约束条件封装
Stevia+Alignment.swift
Horizontally 横向居中对齐
Vertically 竖向居中对齐
Center 中心对齐
有offset方法表示进行偏移
基类方法为以下三个方法:
func align(_ axis: UILayoutConstraintAxis, views: [UIView])
func align(_ axis: UILayoutConstraintAxis, v1: UIView, with v2: UIView, offset: CGFloat)
func align(_ attribute: NSLayoutAttribute, views: [UIView]) -> [UIView]
约束属性枚举:
UILayoutConstraintAxis: 描述两个的横竖向关系 .horizontal, .vertical
NSLayoutAttribute: 描述对象的约束值
所有方法都调用constraint方法添加约束
Stevia+Equation.swift
主要涉及操作符重置,通过操作符重置来设置约束
button.CenterY == avatar.Bottom - 4
label.Width <= button.Width * 3
label.Height == (button.Width / 7) + 3
button.Left >= image.Right - 20
image.Height >= 100
view.Top == 10
以上的所有操作符都已经重载,看的出非常方便,也比较直观
返回值都是NSLayoutConstraint,可以设置权重
(label.Width == button.Width * 3).priority = 1000 // Making this a required constraint.
Stevia+Operators.swift
主要定义控件从左到右添加约束的方法
1 具体父类边缘的具体
2 View之间距离
SideConstraint结构体,表示和父类的边缘的距离
PartialConstraint结构体,表示局部的约束
Stevia+FlexibleMargin.swift
主要处理间距是>=, <=的情况
SteviaFlexibleMargin结构体: 封装数组和NSLayoutRelation(lessThanOrEqual, greaterThanOrEqual)
PartialFlexibleConstraint结构体: 封装 SteviaFlexibleMargin 和 view
Stevia+Style.swift
样式设置语法糖
button.style { b in
b.A = X
b.B = Y
b.C = Z
}
button.style(buttonStyle)
// later
func buttonStyle(b: UIButton) {
..styling code
}
Stevia+Hierarchy.swift
添加到subview下
Stevia+Stacks.swift
核心类
完成控件自上到下布局
layout(
100,
|-email-| ~ 80,
8,
|-password-forgot-| ~ 80,
>=20,
|login| ~ 80,
0
)
主要方法stackV(_ objects: [Any]) -> [UIView]
如果是CGFloat就保存到previousMargin中下次使用,是>=20就保存到previousFlexibleMargin下次使用,每行最后会返回一个View或者[UIView],取出第一个添加top和bottom约束,如果是String(""),表示不进行任何操作
提供了一个自上而下的线性布局