iOS 純代碼玩轉(zhuǎn)自動(dòng)布局

無(wú)論是移動(dòng)端還是PC端開(kāi)發(fā)掷贾,炫酷的UI直接提高了應(yīng)用的檔次隙姿,下面來(lái)說(shuō)說(shuō)我iOS開(kāi)發(fā)中蜒茄,是如何優(yōu)雅的布局的

一唉擂、Masonry

先上一段代碼感受一下,這是設(shè)置視頻播放器下面的工具條的布局

- (void)updateBottomToolbarView
{
    // 底部工具條
    [_bottomToolbar mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self).with.offset(0);
        make.right.equalTo(self).with.offset(0);
        make.height.mas_equalTo(40);
        make.bottom.equalTo(self).with.offset(0);
    }];
    
    // 開(kāi)始按鈕
    [_playOrPauseBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.bottomToolbar).with.offset(0);
        make.height.mas_equalTo(40);
        make.bottom.equalTo(self.bottomToolbar).with.offset(0);
        make.width.mas_equalTo(40);
    }];
    
    // 進(jìn)度條
    [self.progressSlider mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.bottomToolbar).with.offset(45);
        make.right.equalTo(self.bottomToolbar).with.offset(-45);
        make.height.mas_equalTo(40);
        make.top.equalTo(self.bottomToolbar).with.offset(0);
    }];
    
    // 時(shí)間Label
    [self.timeLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.bottomToolbar).with.offset(45);
        make.right.equalTo(self.bottomToolbar).with.offset(-45);
        make.height.mas_equalTo(20);
        make.bottom.equalTo(self.bottomToolbar).with.offset(0);
    }];

    // 全屏按鈕
    [_fullScreenBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self.bottomToolbar).with.offset(0);
        make.height.mas_equalTo(40);
        make.bottom.equalTo(self.bottomToolbar).with.offset(0);
        make.width.mas_equalTo(40);
    }];
}

所有的Frame的設(shè)置都在block里面檀葛,自動(dòng)布局又方便維護(hù)玩祟,<code>MASConstraintMaker</code>這個(gè)是關(guān)鍵類(lèi),有以下屬性方法

@property (nonatomic, strong, readonly) MASConstraint *left;// 左間距
@property (nonatomic, strong, readonly) MASConstraint *top; // 上間距
@property (nonatomic, strong, readonly) MASConstraint *right;// 右間距
@property (nonatomic, strong, readonly) MASConstraint *bottom;// 下間距
@property (nonatomic, strong, readonly) MASConstraint *leading;// 左對(duì)齊
@property (nonatomic, strong, readonly) MASConstraint *trailing;// 右對(duì)齊
@property (nonatomic, strong, readonly) MASConstraint *width;// 寬
@property (nonatomic, strong, readonly) MASConstraint *height;// 高
@property (nonatomic, strong, readonly) MASConstraint *centerX;// X居中對(duì)齊
@property (nonatomic, strong, readonly) MASConstraint *centerY;// Y居中對(duì)齊
@property (nonatomic, strong, readonly) MASConstraint *baseline;// 基線

獲取相應(yīng)的屬性值是這樣的

@property (nonatomic, strong, readonly) MASViewAttribute *mas_left;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_top;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_right;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_bottom;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_leading;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_trailing;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_width;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_height;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_centerX;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_centerY;
@property (nonatomic, strong, readonly) MASViewAttribute *mas_baseline;
@property (nonatomic, strong, readonly) MASViewAttribute *(^mas_attribute)(NSLayoutAttribute attr);

我們可以這樣玩
1.設(shè)置間距后用offset添加偏移量

make.left.equalTo(self.view.mas_left).offset(0);

2.設(shè)置寬的比例

make.width.equalTo(self.view.mas_width).multipliedBy(0.5)

3.設(shè)置參照的視圖等寬高

make.width.and.height.equalTo(self.imageView);

4.設(shè)置內(nèi)邊距

make.edges.equalTo(self.view).with.insets(UIEdgeInsetsMake(10, 10, 10, 10));

二屿聋、SDAutoLayout

這個(gè)庫(kù)也比較好用空扎,鏈?zhǔn)骄幊田L(fēng)格,還能自適應(yīng)tableViewCell的高度润讥,較輕量級(jí)转锈,有興趣可以學(xué)習(xí)學(xué)習(xí),先上一段代碼

     expressionImage.sd_layout
    .topSpaceToView(scrollView,0)
    .leftSpaceToView(scrollView,0)
    .rightSpaceToView(scrollView,0)
    .heightIs(150);
    
    expressionName.sd_layout
    .topSpaceToView(expressionImage,10)
    .leftSpaceToView(scrollView, 15)
    .heightIs(30)
    .widthIs(80);
    
    expressionDownLoad.layer.cornerRadius = 3.0;
    expressionDownLoad.sd_layout
    .topEqualToView(expressionName)
    .rightSpaceToView(scrollView,20)
    .widthIs(80)
    .heightIs(30);
    
    expressionDetail.sd_layout
    .leftEqualToView(expressionName)
    .rightSpaceToView(scrollView,20)
    .topSpaceToView(expressionName,10)
    .autoHeightRatio(0);

// 自適應(yīng)最后一個(gè)控件的高度
    [scrollView setupAutoHeightWithBottomView:expressionItemView bottomMargin:20];

屬性一看就知道楚殿,大家都是成年人撮慨,不用多說(shuō)了吧

需要注意點(diǎn):
1.要先加到父視圖上,再設(shè)置布局
2.可以一個(gè)個(gè)的add脆粥,也可以調(diào)sd_addSubviews一次性add
3.布局要能確定View的位置和大小砌溺,不然可能不會(huì)顯示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市冠绢,隨后出現(xiàn)的幾起案子抚吠,更是在濱河造成了極大的恐慌,老刑警劉巖弟胀,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件楷力,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡孵户,警方通過(guò)查閱死者的電腦和手機(jī)萧朝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)夏哭,“玉大人检柬,你說(shuō)我怎么就攤上這事。” “怎么了何址?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵里逆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我用爪,道長(zhǎng)原押,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任偎血,我火速辦了婚禮诸衔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颇玷。我一直安慰自己笨农,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布帖渠。 她就那樣靜靜地躺著谒亦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪空郊。 梳的紋絲不亂的頭發(fā)上诊霹,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音渣淳,去河邊找鬼。 笑死伴箩,一個(gè)胖子當(dāng)著我的面吹牛入愧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗤谚,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼棺蛛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了巩步?” 一聲冷哼從身側(cè)響起旁赊,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎椅野,沒(méi)想到半個(gè)月后终畅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竟闪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年离福,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炼蛤。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妖爷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出理朋,到底是詐尸還是另有隱情絮识,我是刑警寧澤绿聘,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站次舌,受9級(jí)特大地震影響熄攘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垃它,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一鲜屏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧国拇,春花似錦洛史、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至务热,卻和暖如春忆嗜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背崎岂。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工捆毫, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冲甘。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓绩卤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親江醇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子濒憋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件陶夜、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評(píng)論 4 62
  • 如果你有什么治療失眠和打發(fā)失眠夜的方法請(qǐng)速速聯(lián)系我凛驮,在線等,挺急的条辟。 我覺(jué)得失眠和我的心態(tài)和心理暗示有很大的...
    吃一大口可愛(ài)醬閱讀 282評(píng)論 0 1
  • 伊斯坦布爾是一個(gè)同時(shí)跨越歐黔夭、亞兩大洲的名城,位于土耳其西北部馬爾馬拉地區(qū)羽嫡,而位于黑海和馬爾馬拉海之間的博斯普魯...
    流浪的毛毛閱讀 484評(píng)論 9 12
  • 20年來(lái)火影忍者給我們帶來(lái)了快樂(lè)纠修,就算如今鳴人死了,他也永遠(yuǎn)活在我們心中厂僧!向鳴人敬禮扣草!
    張家之才閱讀 228評(píng)論 0 1
  • 孤雁 獨(dú)立荒原久, 茫然不復(fù)歸。 早知兩相失辰妙, 何若本孤飛鹰祸? 題夢(mèng)幻仙子鏡湖入畫(huà)照 仙子悠然身入畫(huà), 鏡湖湛湛草盈...
    肖三羊閱讀 1,064評(píng)論 9 4