自定義瀑布流

2021-07-10 23:25:11 字數 4384 閱讀 3538

// 在.h裡@class, 在.m裡#import

@class

dkflowlayout;

@protocol

dkflowlayoutdelegate

- (cgfloat) layout: (dkflowlayout *)layout heightforitematindexpath:(nsindexpath *) indexpath width: (cgfloat) width;

@end

@inte***ce

dkflowlayout : uicollectionviewlayout

// 指定有多少列(一般2到4列)

@property (nonatomic, assign) nsinteger columncounts;

// 設定距離螢幕四周的邊界距離

@property (nonatomic, assign) uiedgeinsets edgeinsets;

// 列間距

@property (nonatomic, assign) nsinteger columnspace;

// 行間距

@property (nonatomic, assign) nsinteger rowspace;

@property (nonatomic, assign) id

delegate;

@end

#define kwidth self.collectionview.frame.size.width

@inte***ce

dkflowlayout ()

// 用來儲存每一列的 y 值

@property (nonatomic, retain) nsmutabledictionary *columndic;

// 用來存放 item 的 attribute 物件

@property (nonatomic, retain) nsmutablearray *attributsarray;

@end

@implementation

dkflowlayout

// 1.初始化方法

- (instancetype) init

return

self;

}// 2.preparelayout方法: collectionview 布局 item 的時候,該方法會被執行

- (void) preparelayout

// 獲取 collectionview 上 item 的個數

nsinteger count = [self

.collectionview numberofitemsinsection:0];

// 迴圈遍歷每個 item

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

}// 3.自定義乙個方法設定每個 item 的資訊

- (void) setitemframe: (nsinteger) index

}];// 寬 = (螢幕寬 - 左邊界 - 右邊界 - 列間距 * (列數 - 1)) / 列數

cgfloat width = (kwidth - self

.edgeinsets

.left - self

.edgeinsets

.right - self

.columnspace * (self

.columncounts - 1)) / self

.columncounts;

// x = 左邊距 + (寬 + 列間距) * 列的下標(對應當前最短那列的下標)

cgfloat x = self

.edgeinsets

.left + (width + self

.columnspace) * [mincolumn floatvalue];

// 建立乙個 indexpath

nsindexpath *indexpath = [nsindexpath indexpathforitem:index insection:0];

// 高

cgfloat height = [self

.delegate layout:self heightforitematindexpath:indexpath width:width];

// y

// 先找到當前最短那列的 y 值

cgfloat miny = [self

.columndic[mincolumn] floatvalue];

// 為最短的列更新 y 軸的高度 = miny + 高 + 行間距

self

.columndic[mincolumn] = @(miny + height + self

.rowspace);

// uicollectionviewlayoutattributes: 設定 item 的 frame, bounds, 透明度等屬性

uicollectionviewlayoutattributes *attribute = [uicollectionviewlayoutattributes layoutattributesforcellwithindexpath:indexpath];

attribute.frame = cgrectmake(x, miny, width, height);

[self

.attributsarray addobject:attribute];

}// 4.把所有樣式返回,告訴系統如何去布局

- (nullable nsarray

<__kindof uicollectionviewlayoutattributes *> *)layoutattributesforelementsinrect:(cgrect)rect

// 5.設定滾動的範圍

- (cgsize) collectionviewcontentsize

}];cgfloat h = [self

.columndic[maxy] floatvalue] + self

.edgeinsets

.bottom;

return cgsizemake(0, h);

}@end

@inte***ce

mycell : uicollectionviewcell

@property (nonatomic, retain) uiimageview *picimageview;

@property (nonatomic, retain) picture *pic;

@end

@implementation

mycell

- (instancetype) initwithframe:(cgrect)frame

return

self;

}- (void) layoutsubviews

// 重寫 cell 的 set 方法

- (void) setpic:(picture *)pic

[self

.picimageview sd_setimagewithurl:[nsurl urlwithstring:_pic.thumburl]];

}@end

.h

@inte***ce

picture : nsobject

@property (nonatomic, copy) nsstring *thumburl;

@property (nonatomic, copy) nsnumber *width;

@property (nonatomic, copy) nsnumber *height;

@end

- (void) createdata 

}- (void) createview

- (nsinteger) collectionview:(uicollectionview *)collectionview numberofitemsinsection:(nsinteger)section

- (uicollectionviewcell *)collectionview:(uicollectionview *)collectionview cellforitematindexpath:(nsindexpath *)indexpath

- (cgfloat) layout:(dkflowlayout *)layout heightforitematindexpath:(nsindexpath *)indexpath width:(cgfloat)width

// data.json

[ ,

......

05 自定義瀑布流

自定義了乙個uicollectionviewflowlayout的子類,在使用的時候需要建立自定義flow layout的物件,實現協議方法來實現瀑布流效果 一 原理 首先,獲得的尺寸,一般在資料中都會給出的尺寸 計算itemwidth,假設瀑布流為兩行,itemwidth screenwidth ...

瀑布流布局與自定義瀑布流布局外掛程式

瀑布流布局是網頁中經常採用的一種布局方式,其布局有如下特點 瀑布流布局特點 1 元素按列排放 2 列寬一致,但高度不等 3 布局過程中將優先向高度最小的列補充資料 以下是自定義的乙個jquery瀑布流外掛程式 jquery.mywaterfull.js function arrheight.push...

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...