iOS使用CollectionView實現瀑布流

2021-07-10 12:50:34 字數 4527 閱讀 2097

將螢幕等分成三列 然後將載入到每一列中,在加入到列之前,首先判斷那一列的高度最低,然後把加到高度最低的那列中。

使用uicollectionview,採用自定義布局的方式,設定cell的排列規則 完成瀑布流。

自定義布局中,指定滾動方向,預設列數,行間距,列間距,以及指定cell的大小itemsize

建立乙個陣列columnmaxys(記錄當前每一列的最大y值)

通過判斷記錄的最大y值是否為最小的一列 計算item的x座標 和y座標 並記錄新增上的item那一列的最大y座標 設定item的frame屬性

當我們的item進入復用池的時候,我們的介面展示的我們眼睛看到的以及我們想的,是和事實不相符的。 當我們向上滑動的時候你感覺 y值在無線變大,但其實我們的y值在最上方還是0。這裡就需要用到preparelayout方法。這個方法會在item出現在螢幕上之前反覆執行。

在第一次載入的時候我們會計算所有的item的布局屬性,但是當我們上下滑動的時候,還是需要重新計算這些布局屬性,所以我們需要提供乙個布局屬性陣列存放cell的布局屬性,避免必要的計算。

我們需要知道如何返回我們計算出來的item的布局屬性,並且在那裡計算合適,不會出現資料丟失的現行, layoutattributesforelementsinrect:(返回所有元素的布局屬性陣列)。

這裡需要設定collection的滾動屬性 ,就需要設定她的contentsize 。沒關係系統已經給出了這樣的方法collectionviewcontentsize

#import 

@inte***ce

zqcollectionviewcontroller : uicollectionviewcontroller

@end

#import "zqcollectionviewcontroller.h"

#import "zqcollectionviewcell.h"

#import "zqcollectionviewlayout.h"

@inte***ce

zqcollectionviewcontroller ()

@end

@implementation

zqcollectionviewcontroller

static

nsstring * const reuseidentifier = @"cell";

- (void)viewdidload

zqcollectionviewlayout *layout=[[zqcollectionviewlayout alloc]init];

layout.imagelist=arr;

self

.collectionview

.collectionviewlayout=layout;

[self

.collectionview registernib:[uinib nibwithnibname:@"zqcollectionviewcell" bundle:nil] forcellwithreuseidentifier:reuseidentifier];

}- (nsinteger)numberofsectionsincollectionview:(uicollectionview *)collectionview

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

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

@end

#import 

@inte***ce

zqcollectionviewcell : uicollectionviewcell

//注意這裡是使用xib繪製的

@property (weak, nonatomic) iboutlet

uiimageview *imgv;

@end

#import "zqcollectionviewcell.h"

@implementation

zqcollectionviewcell

@end

#import 

@inte***ce

zqcollectionviewlayout : uicollectionviewlayout

@property(nonatomic,copy)nsarray *imagelist;

@end

#import "zqcollectionviewlayout.h"

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

//static 只在當前作用域使用 const 不可修改的

static

const

uiedgeinsets newdefaultinsets=;

//定義行列之間的間距

static

const

cgfloat newdefaultcolumn=10;

//定義預設的列數

static

int newderaultnumber=3;

@inte***ce

zqcollectionviewlayout ()

//建立陣列存放 y值最大值 存放cell的布局屬性

@property(nonatomic,strong)nsmutablearray *columnarr;

@property(nonatomic,strong)nsmutablearray *cellarr;

@end

@implementation

zqcollectionviewlayout

- (nsmutablearray *)columnarr

return _columnarr;

}- (nsmutablearray *)cellarr

return _cellarr;

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

}cgfloat x=newdefaultinsets.left +sum*(width+newdefaultcolumn);

cgfloat y=newdefaultinsets.top+summaxy;

attr.frame=cgrectmake(x, y, width, height);

//更新陣列,獲取最大的y 下一次比較時用到 記住每一次都會走下面這個方法 而這個方法 第一次的時候都是0 第二次的時候兩個0 第三次的時候就不一樣了

self

.columnarr[sum]=@(cgrectgetmaxy(attr.frame));

return attr;

}#pragma mark -- 這裡下面的方法 是當我們向上或向下滑動item的時候 我們需要將我們的最大y座標重置 為什麼呢 因為如果你繼續使用最大y座標 它還是向下排列

- (void)preparelayout

//設定cell的布局屬性 這裡的self.layoutattributesforitematindexpath 是本類的乙個屬性 通過對應的indexpath我們可以拿到對應的item的布局屬性 然後儲存起來

[self

.cellarr removeallobjects];

nsinteger count=[self

.collectionview numberofitemsinsection:0];

for (int i=0; insindexpath *indexpath=[nsindexpath indexpathforitem:i insection:0];

uicollectionviewlayoutattributes *attrs=[self layoutattributesforitematindexpath:indexpath];

[self

.cellarr addobject:attrs];

}}#pragma mark -- 設定collectionview的範圍 contentsize

- (cgsize)collectionviewcontentsize

}//這裡返回的橫座標是什麼都可以

return cgsizemake(0, summaxy);

}- (nullable nsarray

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

@end

iOS的集中collection布局

這是乙個簡單幫助實現無限滾動的小框架 這裡沒什麼的,就是造點假資料 height width 的比值,瀑布流必須引數,其餘可無 nsarray hwscales 1.2,1.5,1.3,1.9,1.6,1.1,1.0,0.5,1.5,1.2,1.5,1.3,1.9,1.6,1.1,1.0,0.5,1...

Collection介面的使用

今天在專案中遇到hql查詢返回的是多個物件想取得物件中的屬性,絞盡腦汁想盡各種辦法,最後終於用collection解決了 hql返回多個物件並獲取屬性值 from account a,acctcurbalance b,organization c,currency d,bank e,accountp...

Collection集合的使用

增加 public boolean add objict o 將集合o新增到集合中,成功返回true否則返回false 清空集合 public void clear 刪除元素 public boolean remove object o public boolean contains object ...