collectionViewLayout是個很強大的控件,有了它不僅能幫助我們快捷而準確的解決9宮格布局的問題,更是能解決很多特殊布局的難點.比如,瀑布流:
collectionView的創建需要一個layout屬性
一般來說我們都是直接使用一個UICollectionViewFlowLayout的布局方式,也就是流水布局,來放置我們的collectionView
但是,為了達到瀑布流的效果,我們就需要根據服務器提供的數據,來重寫布局.
創建一個我們自己的布局
這個布局繼承自UICollcetionViewLayout
我們需要重寫這個類的一些方法.并提供一些外部能自定義的屬性
考慮到瀑布流cell和整體的設置需求,留給外部的接口
init方法中去設定一些基本的屬性的默認值
這個方法的設定是為了保證只要布局重新計算,我們就刷新layout里面的attributes
用一個字典來存儲每一列最大的Y值,用一個可變數組來存放界面中所有cell的attributes
貌似還有可以改善的地方,就是此時只去遍歷屏幕中能看見的cell,而不是去遍歷整個collectionview中所有cell
這個就是去計算瀑布流的布局了.
首先是遍歷了字典中所有的maxY來計算最小的那個Y
然后返回這個最短Y的那個cell的attrs,其中的代理方法是為了得到和服務器提供數據比例一致的寬高比.
這個方法需要返回所有的在attrs,但是每次重新布局時prepareLayout就已經計算好了,就不需要我們再次計算了
最后就是要設定下這個collectionView的contentSize了,應該是最大的cellY加上我們所設置的sectionInset的bottom值了
這樣就能夠得到一個自定義的瀑布流的布局了
只需要將自己的模型屬性放到自定義的cell中,然后創建時直接調用這個布局,就能有瀑布流的效果了.這個方法確實要比以前自定義scrollView的思路簡單很多了,而且不需要自己去考慮緩存和datasource方法,使得布局簡單了很多.