Masonry by kino

iOS 屏幕適配用的比較多的第三方

Masonry 本質(zhì)是對(duì)AutoLayout的進(jìn)行的封裝

先看一下AutoLayout

  1. 主要思想:將基于約束系統(tǒng)的布局規(guī)則轉(zhuǎn)化為表示規(guī)則的視圖幾何參數(shù)。每個(gè)都是1元1次線性方程。
    在數(shù)學(xué)層次上比較好解釋:表示視圖布局關(guān)系的線性方程組Y = kx + C;
  2. 特點(diǎn):更多關(guān)注視圖之間的關(guān)系,而非尺寸的具體值。
  3. 每一個(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類型)

  1. 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)換視圖順序。
  1. 約束關(guān)系
    Auto Layout提供三種約束關(guān)系:
>=    NSLayoutRelationLessThanOrEqual、
=      NSLayoutRelationEqual、
<=    NSLayoutRelationGreaterThanOrEqual
即線性方程不一定是等式,也可以是不等式。
  1. 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)行重新布局
  1. equalTomas_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ì)象的值

  1. equalTomas_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);

  1. 方向的定義
    上左為正,下右為負(fù)。視圖的左上角為原點(diǎn)。

參考鏈接:
http://www.itdecent.cn/p/587efafdd2b3
http://ddrv.cn/a/252459

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • iOS開發(fā)Masonry框架源碼解析 前言:這個(gè)框架編程思想主要包括鏈?zhǔn)骄幊?這是一個(gè)iOS在控件布局中的輕量級(jí)框...
    Emma_蟲兒閱讀 602評(píng)論 0 0
  • Masonry -- 使用純代碼進(jìn)行iOS應(yīng)用的autolayout自適應(yīng)布局,對(duì)很多零散的進(jìn)行整理 簡(jiǎn)介 簡(jiǎn)化i...
    XZ_Henry閱讀 1,028評(píng)論 0 0
  • Masonry這個(gè)框架是使用代碼進(jìn)行自動(dòng)布局使用的,它的使用非常廣泛,這段時(shí)間一直在學(xué)習(xí)這個(gè)框架,因此想把學(xué)到的東...
    雪山飛狐_91ae閱讀 2,578評(píng)論 3 24
  • 追求Masonry 小笨狼關(guān)注 1.42015.12.06 15:12*字?jǐn)?shù) 4204閱讀 20062評(píng)論 29喜...
    小小小Lucky閱讀 333評(píng)論 0 0
  • 目前iOS開發(fā)中大多數(shù)頁面都已經(jīng)開始使用Interface Builder的方式進(jìn)行UI開發(fā)了,但是在一些變化比較...
    大雪山大輪寺大輪明王閱讀 1,695評(píng)論 1 2

友情鏈接更多精彩內(nèi)容