UIStackView簡介
UIStackView
是iOS 9+支持的布局控件盒延,主要用于線性布局飞蚓,可以簡化布局滤港,減少約束的使用。之前學(xué)過些WPF玷坠,它也有一個(gè)類似的布局控件蜗搔。不得不說用起來確實(shí)很方便劲藐。
應(yīng)用場景
主要用于線性布局八堡,支持橫向和縱向
主要屬性
-
axis
屬性決定布局方向樟凄,水平或垂直; -
distribution
設(shè)置布局方向的布局方式兄渺; -
alignment
設(shè)置垂直于布局方向的方向的布局方式缝龄; -
spacing
,使用該屬性可以設(shè)置子視圖的最小間距挂谍; -
isBaselineRelativeArrangement
叔壤,該屬性決定了垂直方向的視圖間距是否從基準(zhǔn)線開始計(jì)算; -
isLayoutMarginsRelativeArrangement
口叙,該屬性決定了子視圖的布局是否相對(duì)于他的 layout margins炼绘。
本文沒有涉及最后兩個(gè)屬性。
為什么要使用UIStackView
UIStackView
可以在一定程度上減少約束妄田,簡化布局俺亮,并且使用靈活。在下一節(jié)疟呐,我將用兩種布局思路實(shí)現(xiàn)一個(gè)簡單的登錄界面脚曾。
使用UIStackView需要注意的地方
-
UIStackView
本身是基于Auto Layout實(shí)現(xiàn)的,也就是說它會(huì)自動(dòng)幫你生成一些約束启具。因此本讥,當(dāng)你給子視圖添加約束時(shí),注意不要跟這些隱含的約束沖突鲁冯。 - 在處理含有
intrinsicContentSize
屬性控件的時(shí)候拷沸,注意Content Hugging和Content Compression Resistance約束的優(yōu)先級(jí),否則會(huì)造成拉伸錯(cuò)誤薯演。 -
UIStackView
沒有intrinsicContentSize
屬性撞芍。
使用UIStackView實(shí)現(xiàn)簡單的登錄界面
這一節(jié),我將使用兩種思路實(shí)現(xiàn)一個(gè)簡單的登錄界面涣仿。思路一參照 Auto Layout Guide勤庐,將一個(gè)UILabel
和一個(gè)UITextField
放入到同一個(gè)UIStackView中,也就是有幾行就會(huì)有幾個(gè)UIStackView
我稱之為以行為主好港。思路二愉镰,將所有的UILabel
放入到一個(gè)UIStackView
中,將所有的UITextField
放入到一個(gè)UIStackView
中钧汹,也就是有幾列數(shù)據(jù)就會(huì)有幾個(gè)UIStackView
丈探,我稱之為以列為主。
思路一:以行為主
這種思路參照了Auto Layout Guide拔莱,比較容易想到碗降。每當(dāng)需要添加一行時(shí)隘竭,添加一個(gè)UIStackView
就好了,如下圖所示:
圖中讼渊,
- 白色的矩形框表示
UIStackView
- 粉色的矩形框表示
UILabel
- 綠色的矩形框表示
UITextField
需要的約束有:
- 對(duì)于最外層的
UIStackView
动看,為垂直方向布局:
- leading等于父視圖的leadingMargin
- trailing等于父視圖的trailingMargin
- top等于topLayoutGuide的bottom
- 對(duì)于所有的
UILabel
- Content Hugging的優(yōu)先級(jí)為251
- 對(duì)于所有的
UITextField
- Content Hugging的優(yōu)先級(jí)為250
- width相等
思路二:以列為主
這種思路以列為先,有幾列數(shù)據(jù)就設(shè)置幾個(gè)UIStackView
爪幻。
需要的約束有:
- 對(duì)于最外層的
UIStackView
菱皆,為垂直方向布局:
- leading等于父視圖的leadingMargin
- trailing等于父視圖的trailingMargin
- top等于topLayoutGuide的bottom
- 對(duì)于所有的
UILabel
- Content Hugging的優(yōu)先級(jí)為251
- 對(duì)于所有的
UITextField
- Content Hugging的優(yōu)先級(jí)為250
- 對(duì)于所有的子
UIStackView
- 高度相等
另外,需要注意的是挨稿,為了使UILabel
和UITextField
更好地對(duì)齊仇轻,需要設(shè)置UILabel
所在的UIStackView
的Distribution
為 * Fill Equally*。
對(duì)比
上述兩種思路均可以達(dá)到目的奶甘,復(fù)雜性也比較類似篷店。但是就靈活性而言,思路二更好一些臭家。每當(dāng)需要添加或刪除一行時(shí)疲陕,思路一可能需要重新設(shè)置寬度約束,而思路二不需要調(diào)整約束侣监。但是鸭轮,Content Hugging的優(yōu)先級(jí)二者都需要考慮。
討論
蘋果引入UIStackView
的初衷是為了降低布局的復(fù)雜度橄霉,并建議優(yōu)先采用它解決布局問題窃爷。從本文可以看出,UIStackView
的使用比較簡單姓蜂,可以手動(dòng)額外添加所需的約束按厘,比較靈活。此外钱慢,本文中還有其他一些UIStackView
特性沒涉及到逮京,比如說動(dòng)態(tài)添加元素等,你可以參考下官方的文檔束莫。項(xiàng)目示例代碼見GitHub