stevia別具一格的約束庫

xixinRunBoy發表於2018-03-21

原始碼結構

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

相關文章