UIStackView 簡(jiǎn)單理解

概覽

UIStackView 為單行或者單列提供自動(dòng)布局苹丸、自動(dòng)伸縮特性汞贸,UIScorllview 提供的特性則contentSize 大于frame.size時(shí)可以滑動(dòng)的特性,理論上將二者的特性結(jié)合起來(lái)就能實(shí)現(xiàn)線性文檔流布局,布局從上之下進(jìn)行排列兴猩。

使用場(chǎng)景

對(duì)于一些樣式非常復(fù)雜的列表,需要為每一種樣式單獨(dú)定義一個(gè)cell類早歇,每個(gè)cell的功能各自不同倾芝,如果使用 UITableView 和 UICollectionView來(lái)實(shí)現(xiàn),那么就會(huì)在代理方法里面寫(xiě)好多判斷邏輯(想想你的 UITableView 代理方法是不是寫(xiě)了 if箭跳、else if晨另、switch),有時(shí)候一個(gè)- tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法里面右上百行代碼谱姓,甚至更多借尿。這時(shí)候使用線性文檔流布局是最好不過(guò)的選擇,將不同樣式的組件各自進(jìn)行封裝,各自處理各自的事件, 然后將組件實(shí)例通過(guò) UIStactView 的 addArrangedSubview 添加到布局流中去路翻,UIStactView 會(huì)根據(jù)添加順序依次進(jìn)行布局狈癞。

表視圖的高度是一個(gè)動(dòng)態(tài)性的高度,像有一些場(chǎng)景中文本需要展開(kāi)和收起功能茂契,使用列表視圖實(shí)現(xiàn)是比較復(fù)雜的蝶桶,而使用 UIStackView 實(shí)現(xiàn)就簡(jiǎn)單很多了,組件內(nèi)部只需要管理內(nèi)部的約束關(guān)系掉冶,UIStackView 自動(dòng)實(shí)現(xiàn)伸縮莫瞬。

有限集列表,對(duì)于無(wú)限集列表還是推薦使用 UITableView 或者 UICollectionView, 原因不用多說(shuō)(UICollectionView 和 UITableView 提供 cell 的復(fù)用機(jī)制郭蕉,在性能方面更優(yōu))

舉幾個(gè)例子:

WechatIMG393.png

WechatIMG394.png

會(huì)員中心.gif

以上三個(gè)頁(yè)面全部使用UIStackView 作為容器搭建完成

首先看一下 UIStackView 實(shí)現(xiàn)線性布局結(jié)構(gòu)圖

UIStackview線性布局框架.jpg

具體步驟

創(chuàng)建相關(guān)視圖

overridefuncviewDidLoad(){super.viewDidLoad()letscrollView=UIScrollView()scrollView.backgroundColor=UIColor.redletstackView=UIStackView()stackView.axis=.vertical// 縱向布局stackView.distribution=.equalSpacing// 每個(gè)item之間間距相同stackView.spacing=20// 相鄰item之間間距stackView.alignment=.center// 居中對(duì)齊,不對(duì)item進(jìn)行橫向拉伸view.addSubview(scrollView)scrollView.addSubview(stackView)foriin0..<10{letitemView=UIButton()// 為了演示效果這里采用 uibutton喂江,點(diǎn)擊消失對(duì) UIStackView 布局的影響itemView.setTitle("View\(i)",for:.normal)itemView.addTarget(self,action:#selector(handle),for:.touchUpInside)itemView.backgroundColor=.green? ? ? ? ? ? stackView.addArrangedSubview(itemView)}}@objcfunchandle(btn:UIButton){UIView.animate(withDuration:0.25){btn.isHidden=true}}

UIScorllview 約束設(shè)置

scrollView.snp.makeConstraints{(make)inmake.edges.equalTo(self.view)}

UIStackView 約束設(shè)置,關(guān)鍵步驟召锈,設(shè)置 stackView 定寬或者像下面這樣,依賴于 scrollView 的父視圖寬度获询,高度依賴棧內(nèi)子視圖將其撐開(kāi)涨岁,并撐開(kāi) scrollView 的 contentSize

stackView.snp.makeConstraints{(make)inmake.left.right.equalTo(self.view)make.top.bottom.equalTo(scrollView)}

UIStackView 棧內(nèi)子視圖約束設(shè)置

itemView.snp.makeConstraints{(make)inmake.height.equalTo(200)make.width.equalTo(self.view.frame.width-40)}

預(yù)覽效果

線性布局效果.gif

總結(jié)

UIStackView 是 蘋(píng)果官方在iOS 9.0 推出的非常先進(jìn)的容器視圖,結(jié)合自動(dòng)布局能夠快速的幫助開(kāi)發(fā)者完成各種布局效果吉嚣。我在開(kāi)發(fā)《海馬體照相館》app 的過(guò)程中大量的使用了 UIStackView梢薪,有時(shí)間的話分享一篇 UIStackView 的其他方面的應(yīng)用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尝哆,一起剝皮案震驚了整個(gè)濱河市秉撇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌秋泄,老刑警劉巖琐馆,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異恒序,居然都是意外死亡瘦麸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)歧胁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)滋饲,“玉大人,你說(shuō)我怎么就攤上這事喊巍⊥犁裕” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵崭参,是天一觀的道長(zhǎng)勿她。 經(jīng)常有香客問(wèn)我,道長(zhǎng)阵翎,這世上最難降的妖魔是什么逢并? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任之剧,我火速辦了婚禮,結(jié)果婚禮上砍聊,老公的妹妹穿的比我還像新娘背稼。我一直安慰自己,他們只是感情好玻蝌,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布蟹肘。 她就那樣靜靜地躺著,像睡著了一般俯树。 火紅的嫁衣襯著肌膚如雪帘腹。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天许饿,我揣著相機(jī)與錄音阳欲,去河邊找鬼。 笑死陋率,一個(gè)胖子當(dāng)著我的面吹牛球化,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瓦糟,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼筒愚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了菩浙?” 一聲冷哼從身側(cè)響起巢掺,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劲蜻,沒(méi)想到半個(gè)月后址遇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斋竞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年倔约,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坝初。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浸剩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鳄袍,到底是詐尸還是另有隱情绢要,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布拗小,位于F島的核電站重罪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剿配,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一搅幅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧呼胚,春花似錦茄唐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至年扩,卻和暖如春蚁廓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厨幻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工相嵌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人克胳。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像圈匆,于是被迫代替她去往敵國(guó)和親漠另。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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