iOS-屏幕適配實(shí)現(xiàn)(Masonry)

Masonry簡(jiǎn)介

Masonry是一個(gè)輕量級(jí)的布局框架亭罪,擁有自己的描述語法伊佃,采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝AutoLayout,簡(jiǎn)潔明了并具有高可讀性,而且同時(shí)支持 iOS 和 Max OS X

下載鏈接 Masonry


Masonry配置

使用pods方式引入類庫絮识,pod 'Masonry'
引入頭文件 #import "Masonry.h"


Masonry使用

示例:

[testView mas_makeConstraints:^(MASConstraintMaker *make) {
        
     make.left.mas_equalTo(self.view.mas_left).offset(50);
     make.right.mas_equalTo(self.view.mas_right).offset(-50);           
     make.top.mas_equalTo(self.view.mas_top).offset(50);
     make.bottom.mas_equalTo(self.view.mas_bottom).offset(-50);
}];

基本格式:(make . 指定其的一個(gè)屬性 . 約束關(guān)系)

make.attr.constrains

make:可認(rèn)為是要布局的view的代理
constrains:約束可能是多級(jí)的組合,比如.mas_equalTo(self.view.mas_left).offset(50)的兩級(jí)組合嗽上,顯示找到父view的左邊位置次舌,再向右(X軸)移動(dòng)50點(diǎn)

給控件添加、更新約束

  • 添加新的約束

    [xxxView mas_makeConstraints:^(MASConstraintMaker *make) {
         
      }];
    
  • 刪除控件以前所有約束兽愤,添加新約束

    [xxxView mas_remakeConstraints:^(MASConstraintMaker *make) {
          
      }];
    
  • 更新約束彼念,寫哪條更新哪條,其他約束不變

    [xxxView mas_updateConstraints:^(MASConstraintMaker *make) {
          
      }];
    
關(guān)于更新約束布局相關(guān)的API浅萧,主要用以下四個(gè)API:
-(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)行重新布局
關(guān)于UIView重新布局相關(guān)的API帝簇,主要用以下三個(gè)API:
-(void)setNeedsLayout標(biāo)記為需要重新布局
-(void)layoutIfNeeded查看當(dāng)前視圖是否被標(biāo)記需要重新布局徘郭,有則在內(nèi)部調(diào)用layoutSubviews方法進(jìn)行重新布局
-(void)layoutSubviews重寫當(dāng)前方法,在內(nèi)部完成重新布局操作

設(shè)置約束關(guān)系

約束關(guān)系 說明
equalTo() 和 mas_equalTo() 設(shè)置屬性等于某個(gè)數(shù)值
greaterThanOrEqualTo() 和 mas_ greaterThanOrEqualTo() 設(shè)置屬性大于或等于某個(gè)數(shù)值
lessThanOrEqualTo() 和 mas_ lessThanOrEqualTo() 設(shè)置屬性小于或等于某個(gè)數(shù)值
multipliedBy() 和 mas_ multipliedBy() 設(shè)置屬性乘以因子后的值
dividedBy() 和 mas_ dividedBy() 設(shè)置屬性除以因子后的值

設(shè)置控件布局屬性

布局屬性 說明
尺寸 width丧肴、height残揉、size
邊距 left、top芋浮、right抱环、bottom、leading纸巷、trailing
中心點(diǎn) center镇草、centerX、centerY
邊界 edges

//iOS8之后Masonry新出了幾個(gè)屬性:
//距離邊框的距離何暇,等同于選中Storyboard的Constrain to margins后加約束
@property (nonatomic, strong, readonly) MASConstraint *leftMargin;
@property (nonatomic, strong, readonly) MASConstraint *rightMargin;
@property (nonatomic, strong, readonly) MASConstraint *topMargin;
@property (nonatomic, strong, readonly) MASConstraint *bottomMargin;
@property (nonatomic, strong, readonly) MASConstraint *leadingMargin;
@property (nonatomic, strong, readonly) MASConstraint *trailingMargin;
@property (nonatomic, strong, readonly) MASConstraint *centerXWithinMargins;
@property (nonatomic, strong, readonly) MASConstraint *centerYWithinMargins;

其中l(wèi)eading與left陶夜,trailing與right 在正常情況下是等價(jià)的,但是當(dāng)一些布局是從右至左時(shí)(比如阿拉伯文) 則會(huì)對(duì)調(diào)

關(guān)于mas_xxx和xxx的比較

  • 以equalTo() 和 mas_equalTo()為例
    #define mas_equalTo(...)                 equalTo(MASBoxValue((__VA_ARGS__)))
    #define mas_greaterThanOrEqualTo(...)      greaterThanOrEqualTo(MASBoxValue((__VA_ARGS__)))
    #define mas_lessThanOrEqualTo(...)       lessThanOrEqualTo(MASBoxValue((__VA_ARGS__)))
    
    #define mas_offset(...)                  valueOffset(MASBoxValue((__VA_ARGS__)))
    
    • 默認(rèn)情況下
      equalTo():參數(shù)支持的類型除了NSNumber之外裆站,還有CGPoint CGSize UIEdgeInsets
      mas_equalTo(): 對(duì)其參數(shù)進(jìn)行了一個(gè)Auto Boxing操作(裝箱) MASBoxValue(根據(jù)傳入?yún)?shù)類型的不同条辟,裝箱成 NSValue 或 NSNumber 類型的對(duì)象)黔夭,對(duì)參數(shù)并不挑剔,幾乎是傳啥數(shù)據(jù)類型都可以

    • 對(duì)于對(duì)象或是多個(gè)屬性的處理羽嫡,使用equalTo本姥。特別是多個(gè)屬性時(shí),必須使用equalTo

    • 添加下面的宏(必須加在 #import "Masonry.h" 前面)

      #define MAS_SHORTHAND_GLOBALS
      

      代碼里mas_equalTo可以不加mas前綴杭棵,mas_equalTo和equalTo沒有區(qū)別

      [redView mas_makeConstraints:^(MASConstraintMaker *make) {
          make.width.equalTo(100);
          make.height.mas_equalTo(100);        
      }];
      
  • 以width() 和 mas_width()為例
    • 默認(rèn)情況下
      width():make對(duì)象的一個(gè)屬性婚惫,用來添加寬度約束,表示對(duì)寬度進(jìn)行約束
      mas_width():一個(gè)屬性值魂爪,用來當(dāng)做equalTo的參數(shù)先舷,表示某個(gè)控件的寬度屬性

    • 添加下面的宏(必須加在 #import "Masonry.h" 前面)

      #define MAS_SHORTHAND   
      

      代碼里mas_width可以不加mas前綴

      [redView mas_makeConstraints:^(MASConstraintMaker *make) {
       make.left.mas_equalTo(self.left).offset(10);
       make.top.mas_equalTo(self.top).offset(10);
       make.right.mas_equalTo(self.right).offset(-10);
       make.bottom.mas_equalTo(self.bottom).offset(-10);
      }];
      

設(shè)置約束偏移

方法 參數(shù) 說明
offset(CGFloat offset) CGFloat 控件屬性相對(duì)于參照物偏移多少
centerOffset(CGPoint offset) CGPoint 控件center相對(duì)于參照物的偏移大小
sizeOffset(CGSize offset) CGSize 控件size相對(duì)于參照物偏移多少
insets(MASEdgeInsets insets) MASEdgeInsets 控件四邊相對(duì)于參照物偏移多少

offset示例

[redView mas_makeConstraints:^(MASConstraintMaker *make) {
           make.left.mas_equalTo(self.mas_left).offset(20);
           make.top.mas_equalTo(self.mas_top).offset(20);
           make.right.mas_equalTo(self.mas_right).offset(-20);
           make.bottom.mas_equalTo(self.mas_bottom).offset(-20);
 }];

centerOffset示例

[redView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.size.mas_equalTo(100);
        make.center.equalTo(self).centerOffset(CGPointMake(-100, -100));
 }];

sizeOffset示例

[redView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.center.mas_equalTo(self);
        make.width.and.height.mas_equalTo(self).sizeOffset(CGSizeMake(-40, -40));
}];

insets示例

//具體父控件四周都是20間距
[redView mas_makeConstraints:^(MASConstraintMaker *make) {
       make.edges.mas_equalTo(self).insets(UIEdgeInsetsMake(20, 20, 20, 20));
}];

設(shè)置約束優(yōu)先級(jí)

  • Masonry為我們提供了三個(gè)默認(rèn)的方法,priorityLow()滓侍、priorityMedium()蒋川、priorityHigh(),優(yōu)先級(jí)最大數(shù)值是1000
     typedef UILayoutPriority MASLayoutPriority;
      static const MASLayoutPriority MASLayoutPriorityRequired = UILayoutPriorityRequired;
      static const MASLayoutPriority MASLayoutPriorityDefaultHigh = UILayoutPriorityDefaultHigh;
      static const MASLayoutPriority MASLayoutPriorityDefaultMedium = 500;
      static const MASLayoutPriority MASLayoutPriorityDefaultLow = UILayoutPriorityDefaultLow;
      static const MASLayoutPriority MASLayoutPriorityFittingSizeLevel = UILayoutPriorityFittingSizeLevel;
    
  • 自己設(shè)置優(yōu)先級(jí)的值撩笆,可以通過priority()方法來設(shè)置
    [redView mas_makeConstraints:^(MASConstraintMaker *make) {
          
          make.center.mas_equalTo(self.view);
          
          make.width.mas_equalTo(100).priorityLow();
          make.width.mas_equalTo(50).priorityHigh();
    
          make.height.mas_equalTo(50).priority(200);
          make.height.mas_equalTo(100).priority(800);
      }];
    

設(shè)置約束連詞

with和and捺球,放到表達(dá)式中,卻可以作為連詞讓鏈?zhǔn)奖磉_(dá)式更接近自然語言

//什么也沒有做夕冲,只是返回自己本身
  - (MASConstraint *)with {
    return self;
  }
  
  - (MASConstraint *)and {
    return self;
  }

示例:以下三句作用效果一致

 make.width.width.height.equalTo(@100);
 make.width.and.height.equalTo(@100);
 make.width.height.equalTo(@100);

Masonry注意

  • 使用Masonry添加約束之前氮兵,需要在addSubview之后才能使用,否則會(huì)導(dǎo)致崩潰
  • 在添加約束時(shí)常會(huì)出現(xiàn)一些錯(cuò)誤歹鱼,約束出現(xiàn)問題的原因一般就是兩種:約束沖突和缺少約束泣栈。對(duì)于這兩種問題,可以通過調(diào)試和log排查
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末醉冤,一起剝皮案震驚了整個(gè)濱河市秩霍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚁阳,老刑警劉巖铃绒,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異螺捐,居然都是意外死亡颠悬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門定血,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赔癌,“玉大人,你說我怎么就攤上這事澜沟≡制保” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵茫虽,是天一觀的道長(zhǎng)刊苍。 經(jīng)常有香客問我既们,道長(zhǎng),這世上最難降的妖魔是什么正什? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任啥纸,我火速辦了婚禮,結(jié)果婚禮上婴氮,老公的妹妹穿的比我還像新娘斯棒。我一直安慰自己,他們只是感情好主经,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布荣暮。 她就那樣靜靜地躺著,像睡著了一般旨怠。 火紅的嫁衣襯著肌膚如雪渠驼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天鉴腻,我揣著相機(jī)與錄音,去河邊找鬼百揭。 笑死爽哎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的器一。 我是一名探鬼主播课锌,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼祈秕!你這毒婦竟也來了渺贤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤请毛,失蹤者是張志新(化名)和其女友劉穎志鞍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體方仿,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡固棚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仙蚜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片此洲。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖委粉,靈堂內(nèi)的尸體忽然破棺而出呜师,到底是詐尸還是另有隱情,我是刑警寧澤贾节,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布汁汗,位于F島的核電站趟紊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏碰酝。R本人自食惡果不足惜霎匈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望送爸。 院中可真熱鬧铛嘱,春花似錦、人聲如沸袭厂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纹磺。三九已至帖烘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間橄杨,已是汗流浹背秘症。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留式矫,地道東北人乡摹。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像采转,于是被迫代替她去往敵國和親聪廉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Masonry是一個(gè)輕量級(jí)的布局框架故慈,擁有自己的描述語法板熊,采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝自動(dòng)布局,簡(jiǎn)潔明了并具有高可讀性...
    3dcc6cf93bb5閱讀 1,753評(píng)論 0 1
  • (一)Masonry介紹 Masonry是一個(gè)輕量級(jí)的布局框架 擁有自己的描述語法 采用更優(yōu)雅的鏈?zhǔn)秸Z法封裝自動(dòng)布...
    木易林1閱讀 2,316評(píng)論 0 3
  • iOS_autoLayout_Masonry 概述 Masonry是一個(gè)輕量級(jí)的布局框架與更好的包裝AutoLay...
    指尖的跳動(dòng)閱讀 1,153評(píng)論 1 4
  • Masonry手寫Autolayout專題 Masonry介紹與使用實(shí)踐:快速上手Autolayout http:...
    Kevin_Junbaozi閱讀 1,136評(píng)論 0 2
  • 2017.9.21周文娟(打卡31天) 【目標(biāo)】:完美伴侶(智慧察绷,樣貌干签,良好的經(jīng)濟(jì)條件) 【與目標(biāo)相關(guān)的種子】: ...
    柔光寶寶閱讀 131評(píng)論 0 0