UIStackView 這個(gè)控件,或許你沒有接觸過,但它的確很好用,特別是當(dāng)你需要將一些lable、image、button 等很多控件排列成一行或一列,并且每個(gè)空間還要保持一定的間距時(shí),stackview 將會(huì)為你提供便利。那今天我們就一起來聊聊 UIStackView。在閱讀過程中發(fā)現(xiàn)什么問題請(qǐng)及時(shí)指正,共同進(jìn)步??
UIStackView 是 iOS9 中的新特性,它的主要工作就是約束他的局部或全部的 subviews ,也就是按一定順序排列它的 subviews。stack view 解決的最重要的問題是是當(dāng) subviews 要在豎直方向上平鋪一列或者在水平方向平鋪一行時(shí)候。當(dāng)然你也可以用很復(fù)雜的 autolayout 來達(dá)到這個(gè)效果但是 stack view 絕對(duì)是簡捷的途徑。假如要實(shí)現(xiàn)下圖的排列順序你會(huì)怎么做呢?

UIStackView 的用法是非常簡單的并且很強(qiáng)大。通常你只需要提供subviews 然后調(diào)用初始化方法 init(arrangedSubviews:), 其中 arrangedSubviews 是只讀屬性。你可以采用下面方法來管理并排列subviews:
- addArrangedSubview: //添加subview
- insertArrangedSubview:atIndex: //插入subview
- removeArrangedSubview: //移除Subview
arrangedSubviews 和 stack view 的 subviews 屬性是不同的,但是它屬于 subviews 的一個(gè)子集。換句話說,stack view 可以有沒被整理的 subview(這些 subview 需要你自己去添加約束),但是任何被整理了的 subview 必須在 stack view 的 subviews 中,如果你將一個(gè)view 設(shè)置為 arranged subview 并且它還不是 stack view 的subview,那這個(gè) view 將會(huì)被自動(dòng)添加到為一個(gè) subview 。arrangedSubviews 的順序和 subviews 的順序是相互獨(dú)立的;你知道 subviews 的順序決定了他們的繪制的順序,但是 arrangedSubviews 的順序決定了 stack view 將怎樣放置這些 subview 。
Stack 視圖管理著所有在它的 arrangedSubviews 屬性中的視圖的布局。這些視圖根據(jù)它們?cè)?arrangedSubviews 數(shù)組中的順序沿著 Stack 視圖的軸向排列。精確的布局變量根據(jù) Stack 視圖的 axis, distribution, alignment, spacing, 和其它屬性共同決定。

axis
你可以選擇以下兩種軸向:
- .Horizontal
- .Vertical
distribute
在已選好的軸向基礎(chǔ)上,你要怎樣布局 subviews呢?你可以選擇:
- .Fill
- .FillEqual
- .FillProportionally
- .EqualSpacing
- .EqualCentering
除了
UIStackViewDistributionFillEqually分布以外的分布方式 stack 視圖使用被管理視圖的 intrinsicContentSize 屬性來計(jì)算沿著 stack 軸向的視圖尺寸。UIStackViewDistributionFillEqually 分布將調(diào)節(jié)所有被管理視圖的在 stack 軸向上擁有相同尺寸,以填充 stack 視圖。如果可能,stack 視圖將拉伸所有被管理視圖,來匹配其在 stack 軸向上最長的原有尺寸(保證長寬比的情況下根據(jù) stack 軸向長度拉伸視圖)。stack view 的space屬性決定了兩個(gè) view 之間的間距。
alignment
管理的視圖在垂直于軸向上的布局
- Fill
- Leading
- Center
- Trailing
- FirstBaseline / LastBaseLine
除了
UIStackViewAlignmentFill對(duì)齊方式以外的對(duì)齊方式,stack 視圖使用其管理的視圖的 intrinsicContentSize 屬性來計(jì)算視圖垂直于 stack 軸向的尺寸。 UIStackViewAlignmentFill 重新調(diào)節(jié)了所有其管理的視圖,使這些視圖填充 stack 視圖垂直于其軸向空間。如果可能,stack 視圖將拉伸其所有管理的視圖來匹配其垂直于 stack 軸向的最大固有尺寸。
layoutMarginsRelativeArrangement
如果設(shè)置該屬性的值為 true,stack view 的內(nèi)部 layoutmargins 參與其 subviews 的約束設(shè)置,stack view 將使用相關(guān)邊距與其內(nèi)容對(duì)齊。如果 false(默認(rèn)),則使用 stack view 的邊界。
說了那么多,云里霧里的,還是上代碼好了,下面我們用stackview來實(shí)現(xiàn)上一小節(jié)的內(nèi)容
let sv = UIStackView(arrangedSubviews:views)
sv.axis = .Vertical
sv.alignment = .Fill
sv.distribution = .EqualSpacing
sv.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(sv)
NSLayoutConstraint.activateConstraints([
sv.topAnchor.constraintEqualToAnchor(self.topLayoutGuide.bottomAnchor),
sv.leadingAnchor.constraintEqualToAnchor(self.view.leadingAnchor),
sv.trailingAnchor.constraintEqualToAnchor(self.view.trailingAnchor),
sv.bottomAnchor.constraintEqualToAnchor(self.view.bottomAnchor),
])
運(yùn)行的到:

最后,附贈(zèng)一條鏈接,作者將官方文檔翻譯成中文,講得很清楚,建議大家可以去看一下 http://www.cnblogs.com/tieria/p/4572882.html