iOS學習筆記 瀑布流封裝

2021-07-11 00:57:26 字數 3442 閱讀 4192

最近學習了瀑布流布局,是用collectionview實現的。首先說說設計思路,用collectionview做出來的瀑布流是固定行數或者列數的。以現在主流固定列數為例,每個item就是固定寬,不固定高,同時每個item之間的間距是固定的,那麼每行的y值計算就需要通過前一行的最短的item來確定。

既然是用collectionview實現,而collectionview的布局是通過他的layout來實現,那麼就需要重寫uicollectionviewlayout中的 -(

void

)preparelayout,

-(nsarray*)layoutattributesforelementsinrect:(cgrect)rect,

-(uicollectionviewlayoutattributes *)layoutattributesforitematindexpath:(nsindexpath *)indexpath,

-(cgsize)collectionviewcontentsize。

具體實現如下:

#import @class customwaterflowlayout;

@protocol customwaterflowlayoutdelegate @required

//必須實現的**方法,返回每個item的高度

-(cgfloat)customwaterflow:(customwaterflowlayout *)layout heightforitematindexpath:(nsinteger)index itemwidth:(cgfloat)itemwidth;

@optional

-(nsinteger)colcountincustomwaterflow:(customwaterflowlayout *)layout;

-(cgfloat)colmarginincustomwaterflow:(customwaterflowlayout *)layout;

-(cgfloat)rowmarginincustomwaterflow:(customwaterflowlayout *)layout;

-(uiedgeinsets)edgeinsetsincustomwaterflow:(customwaterflowlayout *)layout;

@end

@inte***ce customwaterflowlayout : uicollectionviewlayout

@property (nonatomic, weak) iddelegate;

@end

#import "customwaterflowlayout.h"

//預設列數

static const nsinteger customdefaultcolumncount = 3;

//每一列之間的間距

static const cgfloat customdefaultcolmargin = 10.0;

//每一行之間的間距

static const cgfloat customdefaultrowmargin = 10.0;

//邊緣間距

static const uiedgeinsets customdefaultedgeinsets = ;

@inte***ce customwaterflowlayout ()

//存放所有cell的布局屬性

@property (nonatomic, strong) nsmutablearray * attributesaarray;

//存放所有列的當前高度

@property (nonatomic, strong) nsmutablearray * colheightarray;

//內容的高度

@property (nonatomic, assign) cgfloat contentheight;

-(cgfloat)colmargin;

-(cgfloat)rowmargin;

-(nsinteger)colcount;

-(uiedgeinsets)edgeinsets;

@end

@implementation customwaterflowlayout

#pragma mark **方法資料處理/常見資料處理

//這樣寫可以在**方法中設定需要的布局資料,也可以有預設資料,是模仿tableview的**實現

-(uiedgeinsets)edgeinsetselse

}-(nsinteger)colcountelse

}-(cgfloat)colmarginelse

}-(cgfloat)rowmarginelse

}//懶載入

-(nsmutablearray *)colheightarray

return _colheightarray;

}-(nsmutablearray *)attributesaarray

return _attributesaarray;

}//初始化

-(void)preparelayout

//清空之前所有的布局屬性

[self.attributesaarray removeallobjects];

//開始建立每乙個cell對應的布局屬性

nsinteger count = [self.collectionview numberofitemsinsection:0];

for (nsinteger i = 0; i < count; i++)

}//決定cell的排布

-(nsarray*)layoutattributesforelementsinrect:(cgrect)rect

//返回indexpath位置cell對應的布局屬性

-(uicollectionviewlayoutattributes *)layoutattributesforitematindexpath:(nsindexpath *)indexpath

}cgfloat x = self.edgeinsets.left + destcol * (self.colmargin + w);

cgfloat y = mincolheight;

if (y != self.edgeinsets.top)

attrs.frame = cgrectmake(x,y,w,h);

//更新最短那列的高度

self.colheightarray[destcol] = @(cgrectgetmaxy(attrs.frame));

cgfloat colheight = [self.colheightarray[destcol] doublevalue];

if (self.contentheight < colheight)

return attrs;

}-(cgsize)collectionviewcontentsize

@end

iOS 瀑布流封裝

功能描述 wslwaterflowlayout 是在繼承於uicollectionviewlayout的基礎上封裝的帶頭腳檢視的瀑布流控制項。目前支援豎向瀑布流 item等寬不等高 支援頭腳檢視 水平瀑布流 item等高不等寬 不支援頭腳檢視 豎向瀑布流 item等高不等寬 支援頭腳檢視 三種樣式的...

iOS 瀑布流封裝

位址如下 功能描述 wslwaterflowlayout 是在繼承於uicollectionviewlayout的基礎上封裝的帶頭腳檢視的瀑布流控制項。目前支援豎向瀑布流 item等寬不等高 支援頭腳檢視 水平瀑布流 item等高不等寬 不支援頭腳檢視 豎向瀑布流 item等高不等寬 支援頭腳檢視 ...

js瀑布流,簡單封裝

乙個很簡單的瀑布流載入,當滾動條滾動到底部時自動載入,先 敬上 lang en charset utf 8 demotitle head li pinterest wrap pinterest wrap ul pinterest wrap ulli style class pinterest wra...