原始碼結構
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(""),表示不進行任何操作 提供了一個自上而下的線性佈局