一:NSLayoutConstraint
-
手碼創(chuàng)建就是所謂的那七個參數(shù)的長的像句子似得方法文兑,之后再在相應(yīng)的節(jié)點(diǎn)下添加約束熙卡。
NSLayoutConstraint添加的兩種方法。
// 高度約束(添加到y(tǒng)ellowView身上)
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:0.0 constant:50];
[yellowView addConstraint:heightConstraint];
// 間距約束(添加到self.view身上)
CGFloat margin = 20;
[self.view addConstraints:@[
// 左邊
[NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeLeft multiplier:1.0 constant:margin],
// 右邊
[NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeRight multiplier:1.0 constant: - margin],
// 底部
[NSLayoutConstraint constraintWithItem:yellowView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant: - margin]
]];
}
- 為了避免和系統(tǒng)生成的自動伸縮的約束不沖突 一般加上這句
系統(tǒng)默認(rèn)這個屬性是yes塞栅。
二:VFL語言添加約束
VFL全稱是Visual Format Language,翻譯過來是“可視化格式語言”
VFL是蘋果公司為了簡化Autolayout的編碼而推出的抽象語言
VFL示例:
canelButton寬72,acceptButton寬50身冀,它們之間間距12
@"H:[cancelButton(72)]-12-[acceptButton(50)]"
wideView寬度大于等于60point,該約束條件優(yōu)先級為700(優(yōu)先級最大值為1000括享,優(yōu)先級越高的約束越先被滿足)
H:[wideView(>=60@700)]
豎直方向上搂根,先有一個redBox,其下方緊接一個高度等于redBox高度的yellowBox
V:[redBox][yellowBox(==redBox)]
水平方向上铃辖,F(xiàn)ind距離父view左邊緣默認(rèn)間隔寬度剩愧,之后是FindNext距離Find間隔默認(rèn)寬度;再之后是寬度不小于20的FindField娇斩,它和FindNext以及父view右邊緣的間距都是默認(rèn)寬度隙咸。(豎線“|” 表示superview的邊緣)
H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|
VFL的使用:
列子:
NSArray *blueHArr = [NSLayoutConstraint constraintsWithVisualFormat:
@"H:|-20-[blueView]-20-|"
options:kNilOptions
metrics:nil views:
NSDictionaryOfVariableBindings(blueView)];
方法介紹
constraintsWithVisualFormat:這個方法返回了一個數(shù)組;
@"H:|-20-[blueView(100)]-20-|":這句話表明所添加的約束沐悦,H的意思是水平方向添加約束,blueView 視圖名稱五督,(100)代表著blueView 的寬為100藏否,blueView距離父類的左邊20,距離父類的右邊是20;
options:是對其方式;
metrics:返回的是一個字典充包,它的意思是可以將約束中的值用某些字符串來代理副签,然后在這個字典中給多對應(yīng)的字符串賦值,方便修改基矮,并且增加可讀性;
views:返回的也是一個字典淆储,這個字典的意思是:你可以將前面的view用其他字符串來代替,在這里在給他賦給對應(yīng)的view的名字家浇。
我可以將上面的約束語句改成如下這樣:
NSArray *blueHArr = [NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-aa-[cccc(100)]-20-|"
options:kNilOptions
metrics:@{@"aa":@20}
views:@{@"cccc":blueView}];
這里我用aa替換了20本砰,cccc替換了blueVuew
這里有一個簡單的方法,就是使用NSDictionaryOfVariableBindings(blueView)來替換views中的內(nèi)容也是可以的钢悲。
VFL的缺點(diǎn)
VFL語句不支持乘除法点额,我們是不能這樣寫的:
NSArray *redVArr = [NSLayoutConstraint
constraintsWithVisualFormat:@"V:[blueView]-20-[redView(==blueView*0.5)]"
options:NSLayoutFormatAlignAllRight
metrics:nil
views:NSDictionaryOfVariableBindings(blueView, redView)];
原因就是這里包含了乘法,而一旦VFL語句中包含了乘除法那么系統(tǒng)就會不識別而崩潰莺琳。
三:關(guān)于常用的手碼約束的第三方框架
有 Masonry 和 UIView+Autolayout 與 MyLinearLayout
Masonry框架
這個框架是重量級的里面好多文件还棱,難于上手,但是用熟練了的話比上面那個牛X惭等,適合于約束要經(jīng)常改變的項(xiàng)目
UIView+Autolayout框架
這個相對于masonry珍手,是個輕量級的框架易于上手,里面一共也就兩個文件辞做。也非常好用琳要,都是用auto開頭。適用于約束不經(jīng)常改變的項(xiàng)目
MyLinearLayout
MyLinearLayout的實(shí)現(xiàn)充分參考了Android中的LinearLayout布局秤茅,但是卻比LinearLayout更為強(qiáng)大焙蹭,他幾乎可以實(shí)現(xiàn)AutoLayout的所有功能甚至其不具備的功能。MyLinearLayout是一個基于流式布局的容器視圖嫂伞,我們只需要把子視圖添加到MyLinearLayout中孔厉,并設(shè)置一些簡單的約束參數(shù)那么就可以完成各種布局的要求了。