iOS9 Programming - UIStackView

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 01.png

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, 和其它屬性共同決定。

StackView屬性示意圖.png

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)行的到:

v2移除之前.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容