UIStackView是個(gè)非常好用的視圖管理容器远豺,其使用AutoLayout來(lái)管理視圖专执,添加淮捆、移除、隱藏 都會(huì)自動(dòng)響應(yīng)本股。了解其原理攀痊,可以很輕松的創(chuàng)建基于autoLayout的視圖。
布局原理
任何布局方法拄显,最本質(zhì)的都是要確定兩個(gè)東西苟径,一個(gè)是位置,一個(gè)是大小棘街。
UIStackView 根據(jù)不同的布局模式承边,以及 組件內(nèi)部自然大小intrinsicContentSize 共同決定 位置和大小,如果組件沒(méi)有intrinsicContentSize博助,在非UIStackViewDistributionFillEqually模式下就無(wú)法確定stackview內(nèi)的組件大小险污,可以可以設(shè)置大小約束來(lái)滿足約束。
UIStackView
- 使用軸axis來(lái)表示布局方向翔始,從左到右里伯,還是從上到下
- 使用distribution來(lái)決定軸方向上的布局規(guī)則
- 使用alignment來(lái)決定垂直于軸向的布局規(guī)則
- 使用space來(lái)決定view之間的最小距離
對(duì)于 UIStackViewDistributionFillProportionally 模式,等于這個(gè)space疾瓮。而UIStackViewDistributionEqualSpacing 和 UIStackViewDistributionEqualCentering 表示的是最小距離脖镀。默認(rèn)值是0,為負(fù)數(shù)則表示可以疊加狼电。
在主軸分布模式上,除了 相等填充外强窖,其他的都會(huì)考慮 intrinsicContentSize削祈。而空間太大或者太小脑漫,要考慮 拉伸或壓縮優(yōu)先級(jí)咙崎。另外也可以手動(dòng)添加約束,尤其是大小約束褪猛,比如UIView是不知道自己大小的伊滋,如果不添加約束 如果 uistackview也沒(méi)有設(shè)置約束,stackview就無(wú)法計(jì)算自己的大小笑旺。
軸向布局 UIStackViewDistribution
UIStackViewDistributionFill 充滿容器
[圖片上傳中...(image.png-b44e6c-1685339938517-0)]
- 如果容器大小固定,則 子視圖 充滿stackview座柱,如果 intrinsicContentSize 不能滿足物舒,會(huì)使用 拉伸優(yōu)先級(jí) 進(jìn)行處理
- 如果容器大小不固定,則 子視圖 根據(jù) intrinsicContentSize 充滿stackview火诸,stackview的大小就是管理的容器大小之和 (加上space)
UIStackViewDistributionFillEqually 相等填充
-
各個(gè)子view大小相同荠察,忽略 intrinsicContentSize
UIStackViewDistributionFillProportionally 按比例填充
-
根據(jù) intrinsicContentSize 按比例填充
UIStackViewDistributionEqualSpacing 等間距
space為最小間距悉盆,當(dāng) intrinsicContentSize 無(wú)法充滿stackView時(shí),會(huì)增加間距秋秤。
UIStackViewDistributionEqualCentering view之間的距離相等
垂直于軸向布局 UIStackViewAlignment
UIStackViewAlignmentFill
充滿空間脚翘,默認(rèn)以占空間最大的高度為準(zhǔn)
UIStackViewAlignmentCenter
劇中分布
UIStackViewAlignmentLeading
UIStackViewAlignmentTrailing
UIStackViewAlignmentTop
UIStackViewAlignmentBottom
UIStackViewAlignmentFirstBaseline
UIStackViewAlignmentLastBaseline
uistackview常用模式
-
僅設(shè)置位置,大小由內(nèi)容撐開
前提是 知道內(nèi)容大小 像 UILabel涩咖,UIImageView 都是知道自己大小的,如果加入不知道大小的view抠藕,可以自行設(shè)置 大小約束
-
設(shè)置位置 + 一個(gè)方向的大小盾似,另一個(gè)方向自動(dòng)撐開
需要注意的是,通常需要設(shè)置 內(nèi)容拉伸或者壓縮優(yōu)先級(jí)
-
固定大小和位置
圖片通常使用 保持寬高比適應(yīng)模式
因?yàn)槟J(rèn)拉伸第一個(gè)label的垂直空間,需要需要設(shè)置圖片的拉伸優(yōu)先級(jí)低于label
這里由于沿垂直軸劇中分布告抄,默認(rèn)圖片比較小,還需要設(shè)置圖片跟父容器一樣的大小
所以龄糊,要想用好UIStackView 以下2點(diǎn)格外重要
- 要了解 軸向布局 和 垂直軸向布局
- 要確認(rèn)UIStackView是自動(dòng)大小還是固定大小募疮, 以及如何確認(rèn) 子視圖的大小 必要時(shí) 修改 內(nèi)容拉伸和壓縮優(yōu)先級(jí)