UIStackView
是 iOS 9 中引入的一個(gè)十分實(shí)用的類馆衔,結(jié)合 Auto Layout 可以實(shí)現(xiàn)一些十分復(fù)雜的界面贡歧。通常我們還會(huì)使用 UIStackView
來等距分布一些 view,比如下圖的這個(gè)界面:
我們能發(fā)現(xiàn)在頂部的篩選欄中探膊,每個(gè)篩選項(xiàng)之間都有一個(gè)分割線杠愧,但是 iOS 默認(rèn)并沒有提供這個(gè)分割線的功能,所以只好自己實(shí)現(xiàn)咯逞壁。
文章開始之前流济,先放一個(gè)我已經(jīng)做好的干貨,不想看實(shí)現(xiàn)方法的可以直奔下面的鏈接:
CVStackViewSeparator - GitHub
實(shí)現(xiàn)分析
我采用的方法是 Category + Runtime腌闯,這樣可以極大程度地保證原有代碼不需要進(jìn)行改動(dòng)绳瘟,更方便使用。
首先聲明幾個(gè)屬性姿骏,我們的分隔線用得到:
這幾個(gè)屬性需要用 objc_getAssociatedObject
和 objc_setAssociatedObject
來獲取和設(shè)置糖声。但是由于這幾個(gè)屬性也不少了,所以我想到使用另外一個(gè)類來集中管理分瘦,然后將布局邏輯也在其中實(shí)現(xiàn)姨丈。
下面是這個(gè)類的聲明:
然后寫一個(gè)方法來得到與 UIStackView
相關(guān)聯(lián)的 UIStackViewSeparatorHelper
:
然后,很自然地我們就可以拿到這個(gè)對象來存儲(chǔ)顏色擅腰、寬度等屬性了。
接下來我們 hook 一下 UIStackView
布局子視圖的方法:
在每次布局子視圖時(shí) invalidate 一下分割線翁潘,然后重新生成趁冈。
至于分隔線的生成就比較簡單了,我們可以直接用 UIView
來當(dāng)分割線拜马,計(jì)算一下兩個(gè) subviews 之間的位置渗勘,然后設(shè)置適合的 frame
。需要注意分布方向俩莽,即垂直和水平分別有不同的布局方式旺坠。另外還需要注意 UIStackView
只會(huì)負(fù)責(zé) arrangedSubviews
的布局,也就是說我們利用這個(gè)特性來將分割線直接加到 stack view 上而不受其布局扮超,只要我們不使用 addArrangedSubView
即可取刃。
最后我們看看效果:
更具體的實(shí)現(xiàn)大家可以到我的 repo 里研究蹋肮。