學(xué)習(xí)資料
自定義 Collection View 布局
UICollectionView 瀑布流
官方Collection View Programming Guide for iOS文檔翻譯
官方文檔的學(xué)習(xí)非常重要宿刮,特別是第六章,以下是中文翻譯:
Collection View Programming Guide for iOS---(一)----About iOS Collection Views
Collection View Programming Guide for iOS---(二)----Collection View Basics
Collection View Programming Guide for iOS---(三)---Designing Your Data Source and Delegate
Collection View Programming Guide for iOS---(四)---Using the Flow Layout
Collection View Programming Guide for iOS---(五)---Incorporating Gesture Support
Collection View Programming Guide for iOS---(六)---Creating Custom Layouts
Collection View Programming Guide for iOS---(七)---Custom Layouts: A Worked Example
時(shí)間流
CollectionView Timeline Layout
個(gè)人總結(jié)
等寬不等高(固定列數(shù))瀑布流原理
從上至下吏夯,創(chuàng)建一個(gè)列數(shù)的數(shù)組存儲(chǔ)每列的當(dāng)前總高度静浴,比如有3列,則數(shù)組為columnWidthArray[3]适荣,初始化值都為0现柠。
遍歷設(shè)置每個(gè)item的LayoutAttributes,查找columnWidthArray中最小值弛矛,將item放置于此列下面够吩,并且更新此列高度。
當(dāng)循環(huán)完畢丈氓,從columnWidthArray中可以取到所有列的高度周循,當(dāng)然也就獲得了最大的高度,此時(shí)ContentSize的高度自然也就得到了万俗。
所以如果item列表是按時(shí)間排序湾笛,但是因?yàn)閕tem布局是每次都放在最小高度列,所以瀑布流的時(shí)間是亂序的闰歪,這對(duì)于強(qiáng)要求時(shí)間排序的需求是不能滿(mǎn)足的迄本,這也是瀑布流的缺陷。
當(dāng)然還有更復(fù)雜的瀑布流布局课竣,下面的幾個(gè)開(kāi)源瀑布流就支持多種布局嘉赎。時(shí)間流布局
顧名思義,時(shí)間流當(dāng)然是按時(shí)間排序的于樟,具體可以參考上面時(shí)間流的文章公条。百度/google圖片搜索的布局
可以看出他們的布局都是等高的,但每列的列數(shù)是不等的迂曲,圖片的寬度也是不等的靶橱。圖片是等比例縮放。
可以參考知乎上的這個(gè)問(wèn)題:百度圖片的橫向瀑布流是怎么實(shí)現(xiàn)的路捧?自定義UICollectionViewFlowLayout/UICollectionViewLayout
自定義Layout可以創(chuàng)建出任意布局关霸,因?yàn)樗衖tem的布局都是開(kāi)發(fā)者自己決定的,item之間甚至可以任意重疊杰扫,UICollectionViewFlowLayout默認(rèn)的section的header/footer其實(shí)只是supplementary view的一種實(shí)現(xiàn)队寇,用戶(hù)可以可以創(chuàng)建任意多的supplementary view而且任意布局,除了supplementary view還有decoration view章姓,具體的參考官方文檔:
Collection View Programming Guide for iOS---(六)---Creating Custom Layouts
Collection View Programming Guide for iOS---(七)---Custom Layouts: A Worked Example
以及上面的時(shí)間流文章。
幾個(gè)開(kāi)源瀑布流
https://github.com/SeacenLiu/WaterfallLayout/blob/master/WaterfallLayout/WaterfallLayout.swift
https://github.com/codingZero/XRWaterfallLayout
https://github.com/wsl2ls/WSLWaterFlowLayout