Mansory的常用類
Mansory 是對NSLayoutConstraint的封裝。
Swift語言的,最好使用SnapKit布局框架,但是如果OC和Swift混合編碼的話為了兼容OC,還是會用到Mansory框架。如果是純Swift開發的話,盡量用
pod 'SnapKit'
,同一個作者開發的。
使用mas_makeConstrains方法的元素必須事先添加到父視圖中
對View的擴展類
//約束方法
func mas_makeConstraints(_ block: ((MASConstraintMaker?) -> Swift.Void)!) -> [Any]!
func mas_updateConstraints(_ block: ((MASConstraintMaker?) -> Swift.Void)!) -> [Any]!
func mas_remakeConstraints(_ block: ((MASConstraintMaker?) -> Swift.Void)!) -> [Any]!
//計算型屬性
var mas_left: MASViewAttribute! { get }
//其他方法
//找到共同的父視圖
func mas_closestCommonSuperview(_ view: UIView!) -> Self!
……
方法比較:
-
mas_makeConstraints
只負責添加約束 AutoLayout不能同時存在兩條針對同一對象的約束否則會報錯 -
mas_updateConstraints
針對上面的情況 會更新在block中出現的約束 不會導致出現兩個相同約束的情況 -
mas_remakeConstraints
清除之前所有的約束只保留新的約束
MASConstraintMaker類
open var left: MASConstraint! { get }
open var top: MASConstraint! { get }
……
open var edges: MASConstraint! { get }
open var size: MASConstraint! { get }
open var center: MASConstraint! { get }
(默認是父視圖的中心,設置CGpoint是設置偏移中心點的值)
MASConstraint類
//insert
func insets() -> ((UIEdgeInsets) -> MASConstraint?)!
func centerOffset() -> ((CGPoint) -> MASConstraint?)!
func offset() -> ((CGFloat) -> MASConstraint?)!
func multipliedBy() -> ((CGFloat) -> MASConstraint?)!
//設置優先級
func priority() -> ((MASLayoutPriority) -> MASConstraint?)!
//常用方法
func equalTo() -> ((Any?) -> MASConstraint?)!
func greaterThanOrEqualTo() -> ((Any?) -> MASConstraint?)!
func lessThanOrEqualTo() -> ((Any?) -> MASConstraint?)!
func with() -> MASConstraint!
……
func centerYWithinMargins() -> MASConstraint!
//增加程序可讀性
func and() -> MASConstraint!
func with() -> MASConstraint!
//直接設置
func setInsets(_ insets: UIEdgeInsets)
func setSizeOffset(_ sizeOffset: CGSize)
……
基本使用
make 是一個MASConstraintMaker類的實例,然后調用left后,獲取MASConstraint類的實例,然后調用
equalTo()
方法后,返回一個(Any?) -> MASConstraint?
的閉包,然后直接在后面拼接(50)
返回MASConstraint的實例(應該和上述實例相同),然后繼續設置約束。
屬性比較
1、mas_equalTo 和equalTo
mas_equalTo是個宏定義,mas_equalTo
是equalTo
的擴展,可完全替代equalTo
-
equalTo()(@3)
必須轉換成對象形式; - 支持類型轉換,支持復雜類型。是對
equalTo
的封裝。支持CGSize
CGPoint
NSNumber
UIEdgeinsets
。
ps:swift中似乎沒有特別的差異,編譯器轉化成了下面的方法:
open func equalTo() -> ((Any?) -> MASConstraint?)!
2、leftMargin和left
NSLayoutAttributeLeft指的是控件的左邊,具體來說是控件的最左邊;NSLayoutAttributeLeftMargin也是指控件的左邊,但是不是最左邊,具體距離最左邊有多大的Margin和控件的layoutMargins有關。
ps:默認是{8,8,8,8},但是如果是viewController的root view則top和bottom的margins為0,左右margins可能是16或者20,這取決于當前的view尺寸,并且不能修改。
3、and和with
這里的and和with都沒有具體操作只是拿來增加程序可讀性
PS:最后加一段SnapKit的代碼
backView.snp.makeConstraints { (make) in
make.left.equalToSuperview().offset(50)
make.right.equalToSuperview().offset(-50)
make.top.equalToSuperview().offset(50)
make.height.equalTo(backView.snp.width)
}