使用 UIStackView 來(lái)簡(jiǎn)化 AutoLayout 布局

可以維護(hù)的 AutoLayout

在使用 AutoLayout 做界面布局的時(shí)候芯丧,你會(huì)發(fā)現(xiàn)芍阎,做好一個(gè)復(fù)雜界面的約束并不是一件容易的事,經(jīng)常需要很多的調(diào)試缨恒,這在用代碼寫布局的時(shí)候尤為明顯谴咸,因?yàn)闆](méi)有 IB 給你實(shí)時(shí)的反饋當(dāng)前的 Layout 錯(cuò)誤。而且不管是在 IB 還是純代碼的 AutoLayout骗露,其可讀性都不太好岭佳,例如我們創(chuàng)建了下面這樣一個(gè) App Store 的界面:

1.png

Label 和 星標(biāo)圖片之間有很多約束,如果我們遇到了需求改動(dòng)萧锉,想要在星標(biāo)上方多加一行珊随,就得先搞清楚各個(gè)約束是干什么的,再打破幾個(gè)約束柿隙,最后增加一個(gè) Label 并且加上約束叶洞,費(fèi)時(shí)費(fèi)力。

iOS 9 發(fā)布的時(shí)候蘋果提供了一個(gè)新的AutoLayout 工具 UIStackView优俘,可以自動(dòng)完成很多類型的布局京办,并且不用添加任何約束,由 UIStackView 自行管理其 ArrangedSubviews 的約束并且可以讓增刪變的更簡(jiǎn)單帆焕,大大增加了項(xiàng)目的可維護(hù)性惭婿,本文就來(lái)介紹一下 UIStackView 的使用。

UIStackView 本身是建立在 AutoLayout 的約束之上的叶雹,我們不用主動(dòng)給其子視圖添加約束就可以完成自動(dòng)布局财饥,UIStackView 相當(dāng)于一個(gè)可以為你自動(dòng)管理內(nèi)部 View 的一個(gè)容器。想要完成布局大多數(shù)情況你需要做這三步:

1.調(diào)用 -addArrangedSubview: 添加需要布局的 View 到一個(gè) UIStackView 上折晦;
2.配置 UIStackView 的 axix钥星、alignment、distribution满着、spaciing 這四個(gè)屬性谦炒;
3.如果有必要,再嵌套多個(gè) UIStackView 到一個(gè) UIStackView 中风喇。

UIStackView 的主要方法和屬性

2.png
@property(nonatomic) UILayoutConstraintAxis axis;

用于控制 UIStackView 子視圖橫向或縱向布局宁改,有兩種:

  • UILayoutConstraintAxisHorizontal 橫向布局
  • UILayoutConstraintAxisVertical 縱向布局
3.png
@property(nonatomic) UIStackViewAlignment alignment;

這個(gè)屬性稍微復(fù)雜一點(diǎn),當(dāng) axisHorizontal 時(shí)其表示 UIStackView 的子視圖相對(duì)于其上下邊界的對(duì)其方式魂莫。當(dāng) axis 為 Vertical 時(shí)还蹲,表示 UIStackView 的子視圖相對(duì)于其左右邊界的對(duì)其方式,一共有八中,看下面的圖示就很好理解了:

4.png
5.png
@property(nonatomic) UIStackViewDistribution distribution;

這個(gè)屬性用來(lái)控制 UIStackView 在其 axis 方向上的分布谜喊,分別有如下幾種:

6.png

Fill
UIStackView 的子視圖會(huì)沿著其 axis 填充滿 UIStackView潭兽,如果子視圖在 axis 方向上不能放入 StackViewStackView太小)斗遏,則會(huì)按照子視圖的抗壓縮優(yōu)先級(jí)屬性( Content Compression Resistance Priority)從低到高壓縮視圖山卦,直到正好填滿 StackView 為止。

反之最易,如果子視圖在 axis 方向不能填滿 StackViewStackView太大)怒坯,則會(huì)按照子視圖的抗拉伸優(yōu)先級(jí)屬性(Content Hugging Priority)從低到高拉伸視圖,知道正好填滿 StackView 為止藻懒。

這里說(shuō)一點(diǎn),StackView 在沒(méi)有寬高約束的時(shí)候大部分情況是沒(méi)問(wèn)題的视译,因?yàn)樗鼤?huì)根據(jù)子視圖的intrinsic content size 嬉荆、寬高約束、甚至是 frame.size.width frame.size.height 來(lái)計(jì)算自己的寬高酷含,最終會(huì)有一個(gè)intrinsic content size鄙早,這樣我們把 StackView 添加到父視圖中的時(shí)候,可以不約束其寬高椅亚,只定位好 origin 就可以了限番。

FillEqually
這個(gè)屬性簡(jiǎn)單一些,StackView 的子視圖會(huì)沿著axisStackView 內(nèi)均勻分布呀舔。

FillProportionally
按字面意思解釋弥虐,和 FillEqually 類似,也是每個(gè)子視圖都會(huì)被等比例拉伸或者壓縮媚赖,來(lái)填滿 StackView霜瘪,但是這個(gè)是等比例填滿,每個(gè)子視圖會(huì)被 StackView 按照其 intrinsic content size 或者其本身 frame 來(lái)進(jìn)行等比例縮放惧磺,如果要拉伸或者壓縮颖对,每個(gè)子視圖都會(huì)同時(shí)被等比例拉伸或壓縮。

EqualSpacing
StackView 會(huì)在每個(gè)子視圖中間留下等相等的空間距磨隘,此時(shí) Spacing 屬性定義的是這個(gè)間距的最小值缤底。如果 StackView 足夠大,可以保持子視圖的原始尺寸番捂,不拉伸个唧,但是如果 StackView 太小,子視圖會(huì)被壓縮白嘁,也是按照子視圖的抗壓縮優(yōu)先級(jí)屬性( Content Compression Resistance Priority)從低到高壓縮坑鱼,此時(shí)如果有兩個(gè)子視圖有相等的抗壓縮優(yōu)先級(jí),StackView 就不知道壓縮哪個(gè)了,需要調(diào)整子視圖的優(yōu)先級(jí)鲁沥,不要出現(xiàn)相等的情況呼股。

EqualCentering
StackView 會(huì)把每個(gè)子視圖按照中心點(diǎn)等距離排列,此時(shí) Spacing 屬性定義的是這個(gè)間距的最小值画恰。如果 StackView 足夠大彭谁,可以保持子視圖的原始尺寸,不拉伸允扇,但是如果 StackView 太小缠局,子視圖會(huì)被壓縮,也是按照子視圖的抗壓縮優(yōu)先級(jí)屬性( Content Compression Resistance Priority)從低到高壓縮考润,此時(shí)如果有兩個(gè)子視圖有相等的抗壓縮優(yōu)先級(jí)狭园,StackView 就不知道壓縮哪個(gè)了,需要調(diào)整子視圖的優(yōu)先級(jí)糊治,不要出現(xiàn)相等的情況唱矛。

@property(nonatomic) UIStackViewAlignment alignment;

按照 distribution 屬性中的布局方式控制子視圖之間的間距。

總結(jié)

在本文結(jié)束之前井辜,我們看一下上面的 AppStore Demo 在使用 UIStackView 布局后的情況绎谦,是不是簡(jiǎn)介清爽了許多。

7.png

最后粥脚,引用一下 WWDC 蘋果工程師的話窃肠,如果你使用 AutoLayout,那么請(qǐng) Start With Stack View, use constraints as needed!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刷允,一起剝皮案震驚了整個(gè)濱河市冤留,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恃锉,老刑警劉巖搀菩,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異破托,居然都是意外死亡肪跋,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門土砂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)州既,“玉大人,你說(shuō)我怎么就攤上這事萝映∥庖叮” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵序臂,是天一觀的道長(zhǎng)蚌卤。 經(jīng)常有香客問(wèn)我实束,道長(zhǎng),這世上最難降的妖魔是什么逊彭? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任咸灿,我火速辦了婚禮,結(jié)果婚禮上侮叮,老公的妹妹穿的比我還像新娘避矢。我一直安慰自己,他們只是感情好囊榜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布审胸。 她就那樣靜靜地躺著,像睡著了一般卸勺。 火紅的嫁衣襯著肌膚如雪砂沛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天曙求,我揣著相機(jī)與錄音尺上,去河邊找鬼。 笑死圆到,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卑吭。 我是一名探鬼主播芽淡,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼豆赏!你這毒婦竟也來(lái)了挣菲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤掷邦,失蹤者是張志新(化名)和其女友劉穎白胀,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抚岗,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡或杠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宣蔚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片向抢。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖胚委,靈堂內(nèi)的尸體忽然破棺而出挟鸠,到底是詐尸還是另有隱情,我是刑警寧澤亩冬,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布艘希,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏覆享。R本人自食惡果不足惜佳遂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望淹真。 院中可真熱鬧讶迁,春花似錦、人聲如沸核蘸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)客扎。三九已至祟峦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間徙鱼,已是汗流浹背宅楞。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袱吆,地道東北人厌衙。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像绞绒,于是被迫代替她去往敵國(guó)和親婶希。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 目錄 0蓬衡、前言 一喻杈、Auto Layout前世今生 二、Auto Layout基礎(chǔ)知識(shí) 1.Auto Layout...
    浮游lb閱讀 24,333評(píng)論 3 89
  • 翻譯自“Auto Layout Guide”狰晚。 1 入門 1.1 理解自動(dòng)布局 自動(dòng)布局根據(jù)視圖層級(jí)結(jié)構(gòu)中視圖上的...
    lakerszhy閱讀 3,559評(píng)論 3 26
  • 前言 首先筒饰,我們通過(guò)下面這張圖片引出今天的主角 大家看到了什么,是愛(ài)嗎壁晒?不瓷们,這不是愛(ài),不是愛(ài)讨衣,是滿滿的‘愁緒’换棚???...
    一念之見閱讀 2,186評(píng)論 0 2
  • 我的博客, 各位看官有時(shí)間賞光 UIStackView UIStackView介紹 隨著autolayout的推廣...
    VIC_LI閱讀 8,954評(píng)論 0 17
  • 初入社會(huì)固蚤,進(jìn)入一家初創(chuàng)型互聯(lián)網(wǎng)公司,開始漫長(zhǎng)的上班族生活歹茶。 開始的一個(gè)月夕玩,每天很閑你弦,自己也相當(dāng)享受悠閑的上班時(shí)光,...
    Masdu閱讀 233評(píng)論 0 0