iOS 常用布局方式之Masonry

級(jí)別: ★☆☆☆☆
標(biāo)簽:「iOS Masonry」「iOS 自動(dòng)布局」「Masonry」
作者: Xs·H
審校: QiShare團(tuán)隊(duì)


沐靈洛 線下分享iOS UIButton根據(jù)內(nèi)容自動(dòng)布局時(shí)术健,有和前端同學(xué)討論到iOS的常用布局方式。討論過程十分熱鬧粘衬,不容易記錄荞估,但作者認(rèn)為討論結(jié)果有必要記錄一下,希望能幫助到一些同學(xué)稚新。
作者將iOS常用布局方式歸納為Frame勘伺、Autoresizing、Constraint枷莉、StackView和Masonry五種娇昙,并將逐一介紹尺迂。
本篇文章介紹Masonry笤妙。

iOS 常用布局方式之Constraint文章中,作者介紹了NSLayoutConstraint在布局界面時(shí)的強(qiáng)大功能噪裕,但也體驗(yàn)到了NSLayoutConstraint代碼語法的冗長(zhǎng)和不易閱讀性蹲盘。本文要介紹的Masonry就是一個(gè)輕量級(jí)的布局框架,它使用更好的語法包裝AutoLayout膳音,并提供了一種描述NSLayoutConstraint的可鏈接方式召衔,從而使布局代碼更簡(jiǎn)潔,更易讀祭陷。

所以說苍凛,Masonry是基于NSLayoutConstraint的一種第三方框架,可以從GitHub上查看其詳細(xì)介紹兵志。這里醇蝴,作者只展示一下使用Masonry實(shí)現(xiàn)4分圖效果的代碼。

@implementation QiMasonryViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];
    
    _contentView = [[QiMasonryContentView alloc] initWithFrame:CGRectZero];
    _contentView.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:_contentView];
    
    [_contentView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view.mas_top);
        make.left.equalTo(self.view.mas_left);
        make.right.equalTo(self.view.mas_right);
        make.bottom.equalTo(self.view.mas_bottom).with.offset(-20.0);
    }];
}

@end
@implementation QiMasonryContentView

- (instancetype)initWithFrame:(CGRect)frame {
    
    self = [super initWithFrame:frame];
    
    if (self) {
        
        _subView1 = [[UIView alloc] initWithFrame:CGRectZero];
        _subView1.backgroundColor = [[UIColor redColor] colorWithAlphaComponent:.6];
        [self addSubview:_subView1];
        
        _subView2 = [[UIView alloc] initWithFrame:CGRectZero];
        _subView2.backgroundColor = [[UIColor greenColor] colorWithAlphaComponent:.6];
        [self addSubview:_subView2];
        
        _subView3 = [[UIView alloc] initWithFrame:CGRectZero];
        _subView3.backgroundColor = [[UIColor blueColor] colorWithAlphaComponent:.6];
        [self addSubview:_subView3];
        
        _subView4 = [[UIView alloc] initWithFrame:CGRectZero];
        _subView4.backgroundColor = [[UIColor yellowColor] colorWithAlphaComponent:.6];
        [self addSubview:_subView4];
        
        [_subView1 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(20);
            make.left.mas_equalTo(10);
            make.width.equalTo(self.subView2);
            make.height.equalTo(self.subView3);
            make.right.equalTo(self.subView2.mas_left).offset(-20);
        }];
        [_subView2 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(self.subView1.mas_top);
            make.right.equalTo(self).offset(-10);
            make.width.equalTo(self.subView1);
            make.height.equalTo(self.subView4);
        }];
        
        [_subView3 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.subView1.mas_bottom).offset(20);
            make.left.mas_equalTo(10);
            make.width.mas_equalTo(self.subView4);
            make.height.mas_equalTo(self.subView1);
            make.bottom.mas_equalTo(self).offset(-20);
        }];
        [_subView4 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.mas_equalTo(self.subView3);
            make.left.mas_equalTo(self.subView3.mas_right).offset(20);
            make.right.mas_equalTo(self).offset(-10);
            make.width.mas_equalTo(self.subView3);
            make.height.mas_equalTo(self.subView2);
            make.bottom.mas_equalTo(self).offset(-20);
        }];
    }
    
    return self;
}

@end

上述代碼所實(shí)現(xiàn)的效果如下圖所示想罕。

文章中的代碼可以從QiLayoutDemo中獲取悠栓。

iOS 常用布局方式總結(jié)

截止本篇文章,作者逐一介紹了Frame按价、Autoresizing惭适、Constraint、StackView和Masonry五種iOS常用布局方式楼镐。作者的目的是通過對(duì)這幾種布局方式的介紹癞志,能讓一些讀者同學(xué)對(duì)iOS布局有個(gè)全面的了解。至于常被問到的哪種布局方式好框产,實(shí)在是不好回答凄杯,但可以分享一下這些布局方式在項(xiàng)目中的使用情況师溅,以及遇到的問題,供各位讀者同學(xué)參考盾舌。

  • 1. Frame+Autoresizing
    得益于Frame的編程靈活性和Autoresizing的簡(jiǎn)易墓臭,F(xiàn)rame+Autoresizing的組合布局方式在QiShare項(xiàng)目中占比最高。但在一些只需要操作frame某個(gè)屬性(比如妖谴,只想修改寬度)時(shí)窿锉,會(huì)顯得代碼有點(diǎn)冗余。于是膝舅,引入UIView+QiAddition可以在一定程度上得以改善嗡载。如下。
_subView.qi_top = 10.0;
_subView.qi_left = 20.0;
_subView.qi_width = 300.0;
_subView.qi_height = 40.0;
  • 2. 基于Storyboard的Constraint
    Storyboard是個(gè)很方便的工具仍稀,在搭建一些簡(jiǎn)單界面時(shí)洼滚,比Frame編碼要高效很多。結(jié)合AutoLayout的Constraint技潘,可以快速搭建出帶有布局約束的界面遥巴。但是,在對(duì)AutoLayout概念和Constraint掌握不特別清晰時(shí)享幽,常常會(huì)出現(xiàn)約束沖突的情況铲掐,而且排查困難。另外值桩,打開Storyboard文件會(huì)需要更多的電腦性能摆霉,在作者的iMac上會(huì)常常出現(xiàn)卡頓的現(xiàn)象。

  • 3. 基于純代碼的Constraint+Masonry
    三方庫(kù)Masonry是基于NSLayoutConstraint的布局方式奔坟,用純代碼的方式可以更易閱讀地實(shí)現(xiàn)控件約束携栋。但由于NSLayoutConstraint與Frame的不兼容(使用NSLayoutConstraint約束過的控件,再修改frame會(huì)無效)咳秉,在多人合作的項(xiàng)目中很少被用到婉支。

  • 4. Frame+StackView 或 Constraint+StackView
    StackView的使用,主要看有沒有界面需求適合排列布局方式滴某,它不受限于Frame或者Constraint磅摹。但由于UIStackView在iOS9+才會(huì)有,所以最低支持iOS9-的項(xiàng)目中基本不會(huì)使用霎奢。隨著目前項(xiàng)目最低支持版本逐漸升到了iOS10+户誓,UIStackView會(huì)在未來的項(xiàng)目中被越來越多地使用到。


推薦文章:
iOS UIButton根據(jù)內(nèi)容自動(dòng)布局
iOS 指定初始化方法
UIView中的hitTest方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幕侠,一起剝皮案震驚了整個(gè)濱河市帝美,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晤硕,老刑警劉巖悼潭,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庇忌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舰褪,警方通過查閱死者的電腦和手機(jī)皆疹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來占拍,“玉大人略就,你說我怎么就攤上這事』尉疲” “怎么了表牢?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贝次。 經(jīng)常有香客問我崔兴,道長(zhǎng),這世上最難降的妖魔是什么蛔翅? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任敲茄,我火速辦了婚禮,結(jié)果婚禮上搁宾,老公的妹妹穿的比我還像新娘折汞。我一直安慰自己,他們只是感情好盖腿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嫂沉,像睡著了一般谍咆。 火紅的嫁衣襯著肌膚如雪御雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天茂卦,我揣著相機(jī)與錄音,去河邊找鬼组哩。 笑死等龙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的伶贰。 我是一名探鬼主播蛛砰,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼黍衙!你這毒婦竟也來了泥畅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤琅翻,失蹤者是張志新(化名)和其女友劉穎位仁,沒想到半個(gè)月后柑贞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡聂抢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年钧嘶,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琳疏。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡康辑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轿亮,到底是詐尸還是另有隱情疮薇,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布我注,位于F島的核電站按咒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏但骨。R本人自食惡果不足惜励七,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奔缠。 院中可真熱鬧掠抬,春花似錦、人聲如沸校哎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷哆。三九已至腰奋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抱怔,已是汗流浹背劣坊。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屈留,地道東北人局冰。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灌危,于是被迫代替她去往敵國(guó)和親康二。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354