iOS 屏幕適配用的比較多的第三方
Masonry 本質(zhì)是對(duì)AutoLayout的進(jìn)行的封裝
先看一下AutoLayout
- 主要思想:將基于約束系統(tǒng)的布局規(guī)則轉(zhuǎn)化為表示規(guī)則的視圖幾何參數(shù)。每個(gè)都是1元1次線性方程。
在數(shù)學(xué)層次上比較好解釋:表示視圖布局關(guān)系的線性方程組Y = kx + C; - 特點(diǎn):更多關(guān)注視圖之間的關(guān)系,而非尺寸的具體值。
- 每一個(gè)約束需要包含的內(nèi)容:
- Item1 & Item2 : 對(duì)這兩個(gè)視圖進(jìn)行布局
- Attribute1,Attribute2(NSLayoutAttribute類型):表示這2個(gè)視圖滿足什么樣的約束,可以有多個(gè)。
- Relationship(NSLayoutRelation類型):約束關(guān)系,可以是=、>=、<=。
e.g.
Item2的某個(gè)位置屬性 = Multiplier(倍數(shù)) * Item1的某個(gè)位置屬性 + Constant(常量Float類型)
- NSLayoutAttribute :可以進(jìn)行約束的屬性如下:
NSLayoutAttributeWidth、NSLayoutAttributeHeight 表示視圖的尺寸:寬、高
NSLayoutAttributeLeft、NSLayoutAttributeRight 表示視圖的X軸方向的位置:左、右
NSLayoutAttributeLeading、NSLayoutAttributeTrailing 表示視圖的X軸方向的位置:前、后
NSLayoutAttributeTop、 NSLayoutAttributeBottom 表示視圖Y軸方向的位置:頂、底
NSLayoutAttributeBaseline 表示視圖Y軸方向的位置:底部基準(zhǔn)線
NSLayoutAttributeCenterX、NSLayoutAttributeCenterY 表示視圖的中心點(diǎn):視圖在X軸的中心點(diǎn)、視圖在Y軸的中心點(diǎn)
*注意*
只有同類型的約束才能互相做約束
表示尺寸的約束width/height只能與其他視圖的width/height做約束,或者與非負(fù)常數(shù)做約束;
表示Y軸方向的約束屬性(top、bottom、baseLine、CenterY)只能與Y軸方向的約束屬性做約束;
表示X軸方向的約束屬性只能與表示X軸的約束屬性做約束,且leading/trailing不可以跟left/right做約束。
-----
leading表示前邊、trailing表示后邊,在閱讀習(xí)慣從左到右的語言中,leading相當(dāng)于left、trailing相當(dāng)于right。在從右到左的語言中,leading相當(dāng)于right、trailing相當(dāng)于left。
-----
baseLine指視圖的文本內(nèi)容底部,該屬性只對(duì)有文本的控件類型有效(UILabel、UIButton…),并且只有當(dāng)控件賦值了文本,該約束才能正確布局。文本控件的文字頂部與底部與控件本身會(huì)有間隙,當(dāng)要實(shí)現(xiàn)文本底部對(duì)齊,可使用該約束屬性。
------
Item1、Item2位置問題
從數(shù)學(xué)的角度,線性方程式兩邊的Item1、Item2是可以調(diào)換位置的。eg:View右邊距離父視圖superView右邊10pt,可以表示為View.right = superView.right – 10 ; 也可以表示為superView.right = View.right + 10??梢员3忠晥D順序,使用負(fù)數(shù);也可以保持?jǐn)?shù)值為正數(shù),調(diào)換視圖順序。
- 約束關(guān)系
Auto Layout提供三種約束關(guān)系:
>= NSLayoutRelationLessThanOrEqual、
= NSLayoutRelationEqual、
<= NSLayoutRelationGreaterThanOrEqual
即線性方程不一定是等式,也可以是不等式。
-
UILayoutPriority:優(yōu)先級(jí)
默認(rèn)創(chuàng)建出來的約束優(yōu)先級(jí)為UILayoutPriorityRequired(1000),稱為必需約束;其他優(yōu)先級(jí)小于1000的約束稱為可選約束。
舉例
NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:view1 attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100];
Masonry
1.基礎(chǔ)API
mas_makeConstraints() 添加約束,不能同時(shí)存在兩條針對(duì)同一對(duì)象的約束否則會(huì)報(bào)錯(cuò).使用mas_makeConstrains方法的元素必須事先添加到父視圖中
mas_remakeConstraints() 移除之前的約束,重新添加新的約束
mas_updateConstraints() 更新約束,寫哪條更新哪條,其他約束不變
- (void)updateConstraintsIfNeeded 調(diào)用此方法,如果有標(biāo)記為需要重新布局的約束,則立即進(jìn)行重新布局,內(nèi)部會(huì)調(diào)用updateConstraints方法
- (void)updateConstraints 重寫此方法,內(nèi)部實(shí)現(xiàn)自定義布局過程
- (BOOL)needsUpdateConstraints 當(dāng)前是否需要重新布局,內(nèi)部會(huì)判斷當(dāng)前有沒有被標(biāo)記的約束
- (void)setNeedsUpdateConstraints 標(biāo)記需要進(jìn)行重新布局
-
equalTo和mas_equalTo
equalTo() 參數(shù)是對(duì)象類型,如果要傳數(shù)字,則轉(zhuǎn)換為 NSNumber 類型。一般傳控件的相對(duì)位置例如 make.left.equalTo(gray1.mas_right);
mas_equalTo() 參數(shù)可以傳遞基礎(chǔ)數(shù)據(jù)類型對(duì)象,一般傳具體數(shù)值。CGPoint、CGSize、UIEdgeInsets 例如 make.top.mas_equalTo(10);
width() 用來表示寬度,例如代表view的寬度
mas_width() 用來獲取寬度的值。和上面的區(qū)別在于,一個(gè)代表某個(gè)坐標(biāo)系對(duì)象,一個(gè)用來獲取坐標(biāo)系對(duì)象的值
-
equalTo和mas_equalTo后面可以跟什么
- multipliedBy()//對(duì)傳入的值擴(kuò)大倍數(shù)
- dividedBy()//對(duì)傳入的值縮小倍數(shù)
- offset()//對(duì)傳入的值進(jìn)行偏移,參考坐標(biāo)方向。
- insets() //相對(duì)于父坐標(biāo)系 可以+ with
make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));
make.edges.mas_equalTo(0);
- priorityLow()
// Masonry為我們提供了三個(gè)默認(rèn)的方法,priorityLow()、priorityMedium()、priorityHigh(),這三個(gè)方法內(nèi)部對(duì)應(yīng)著不同的默認(rèn)優(yōu)先級(jí)。
//除了這三個(gè)方法,我們也可以自己設(shè)置優(yōu)先級(jí)的值,可以通過priority()傳參設(shè)置。
//可以+ with
方法 with 和 and ,這連個(gè)方法其實(shí)沒有做任何操作,方法只是返回對(duì)象本身,這這個(gè)方法的左右完全是為了方法寫的時(shí)候的可讀性
greaterThanOrEqualTo lessThanOrEqualTo //除了equalTo 和 mas_equalTo 這種相等關(guān)系 還有大于小于
以下2種寫法效果相同
make.left.greaterThanOrEqualTo(label);
make.left.greaterThanOrEqualTo(label.mas_left);
- 方向的定義
上左為正,下右為負(fù)。視圖的左上角為原點(diǎn)。
參考鏈接:
http://www.itdecent.cn/p/587efafdd2b3
http://ddrv.cn/a/252459