請(qǐng)支持原創(chuàng), 如需轉(zhuǎn)載, 請(qǐng)注明出處@TEASON
之前的文章里有說(shuō)要寫關(guān)于UITableView
見(jiàn)解的兩篇, 上一篇在這里, 這是下集.
下面的圖是網(wǎng)易新聞客戶端, 這種結(jié)構(gòu)的首頁(yè)挺多的, 我仿照寫了一下, 總結(jié)了下思路, 要實(shí)現(xiàn)不是特別困難, 不過(guò)有一些細(xì)節(jié)和問(wèn)題我覺(jué)得有必要注意.
下面是我認(rèn)為需要注意的地方 .
1.首先, 他是由什么控件組成的 ?
上下兩個(gè)scrollView, 上面那個(gè)控制標(biāo)簽, 下面控制內(nèi)容, 互相對(duì)應(yīng)切換.
2.如何重用contentView
如果是scrollview, 他里面的內(nèi)容視圖(contentView)要考慮重用, 不然極度浪費(fèi)內(nèi)存 .
可能有兩種可行的解決方案:
方案(1)外部是scrollView
,內(nèi)容用三個(gè)tableView
來(lái)回切換內(nèi)容對(duì)應(yīng)顯示. 這個(gè)思路和這個(gè)demo(無(wú)限循環(huán)scrollview)一樣一樣, 他的優(yōu)勢(shì)是可以做成無(wú)限循環(huán), 能從最后一張切換到第一張 .
方案(2)用collectionView
實(shí)現(xiàn)contentView
重用. 每一個(gè)contentView
作為一個(gè)collectionViewCell
. collectionView
是scrollview
的子類,所以和第一條不矛盾, 能否通過(guò)繼承layout
實(shí)現(xiàn)這種表現(xiàn).
3.分離tableview表示邏輯
這在我的一篇文章中提及, 不過(guò)這次我沒(méi)有用block
再回調(diào)回ctrller
里, 這樣比較適合這個(gè)項(xiàng)目, 方便讓每個(gè)handler
控制一個(gè)tableview
的表示邏輯. 分工比較明確.
于是, 在框架出來(lái)之后, 只需要傳入handler
的List
即可.
demo地址在此
demo由于我是用方案一寫的, 精力在自己寫重用tableView
上用了好多.不過(guò)demo里主要功能和思路都有所體現(xiàn)了 . 歡迎follow我
關(guān)于方案二的版本重寫collectionViewLayout , 寫起來(lái)省事很多, 這個(gè)布局甚至能用storyboard直接0行代碼弄出來(lái)布局, 實(shí)現(xiàn)起來(lái)相當(dāng)容易,demo就不貼了. 但方案二不能循環(huán). 方案一實(shí)現(xiàn)相對(duì)比較難, 而且主要是手動(dòng)實(shí)現(xiàn)了view的重用和循環(huán). 故給出方案一 .
此外, 用UIPageViewController也可以解決,應(yīng)該是方案三.做起來(lái)也比較簡(jiǎn)單.
但. 我認(rèn)為無(wú)論是哪一種方案. 都應(yīng)該考慮controller過(guò)多內(nèi)存緊張的處理. 我認(rèn)為是用緩存做是最好的. 其實(shí)無(wú)論哪一種方案, 重要的是思考過(guò)程, 如果急于求成, 類似的框架網(wǎng)上隨便找找一大堆, 但是不思考純粹貼過(guò)來(lái)就沒(méi)有意義了. 是不是?