自從 Xcode 推出 AutoLayhout 功能後,對於 iOS UI 物件的設定多了一種選擇,但你可能會使用 Storyboard 或是 xib 以圖形化方式來建立,不過,不同 UI 元件的 Constraint 設定有時可能會搞亂整個 Layout。
而使用 NSLayoutConstraint 來做設定卻也可能讓程式碼變得冗長複雜:
let centerHorizontally =
NSLayoutConstraint(
item: <#T##Any#>,
attribute: <#T##NSLayoutConstraint.Attribute#>,
relatedBy: <#T##NSLayoutConstraint.Relation#>,
toItem: <#T##Any?#>,
attribute: <#T##NSLayoutConstraint.Attribute#>,
multiplier: <#T##CGFloat#>,
constant: <#T##CGFloat#>)
這時候你或許會思考:
SnapKit,一個經典的Swift版的第三方庫,專門用於項目的autoLayout,目前在github上的stars就高達16.9顆星,這是一個不小的數字,亦足以證明它存在的非凡意義和作用。作者認為,在iOS開發(swift)中,它是用於項目最優秀的自動佈局的必選庫之一。它的作者仍然是寫Objective-C的第三方庫Masonry的大神 - @Robert Payne
SnapKit設計為非常易於使用。假設我們要佈局一個框,該框使用20pts的填充限製到其superview的邊緣。
let box = UIView()
superview.addSubview(box)
box.snp.makeConstraints { (make) -> Void in
make.top.equalTo(superview).offset(20)
make.left.equalTo(superview).offset(20)
make.bottom.equalTo(superview).offset(-20)
make.right.equalTo(superview).offset(-20)
}
因此,你還可以繼續簡寫。
let box = UIView()
superview.addSubview(box)
box.snp.makeConstraints { (make) -> Void in
make.edges.equalTo(superview).inset(UIEdgeInsetsMake(20, 20, 20, 20))
}
// width >= 200 && width <= 400
make.width.greaterThanOrEqualTo(200)
make.width.lessThanOrEqualTo(400)
但是,“autoLayout”不允許將對齊屬性(如left,right,centerY等)設置為常數。
您還可以使用其他原語和結構來構建約束,如下所示:
make.top.equalTo(42)
make.height.equalTo(20)
make.size.equalTo(CGSize(width: 50, height: 100))
make.edges.equalTo(UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0))
make.left.equalTo(view).offset(UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0))
make.top.equalTo(label.snp.top).priority(600)
你也可以使用快捷鍵的優先級:
.low,.medium,.high,.required。
make.top.equalTo(label.snp.top).priority(.medium)
snapKit 還有一些更進階的用法,可以更加容易的更新,刪除約束這些用法我會再整理一篇文章跟大家分享。