亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS簡單實現瀑布流UICollectionView

2020-07-26 03:29:06
字體:
來源:轉載
供稿:網友

UICollectionView 比tableView 靈活,功能也強大很多。系統實現了流式布局,但用處還有很多限制。

要想實現更靈活的布局,就咬重寫UICollectionViewLayout。
先看下實現效果:

廢話不多說,直接上代碼:

先看WaterfallCollectionLayout.m

#import "WaterfallCollectionLayout.h"#define colMargin 5#define colCount 4#define rolMargin 5@interface WaterfallCollectionLayout ()//數組存放每列的總高度@property(nonatomic,strong)NSMutableArray* colsHeight;//單元格寬度@property(nonatomic,assign)CGFloat colWidth;@end

該類要重寫以下方法:

//完成布局前的初始工作-(void)prepareLayout;//collectionView的內容尺寸-(CGSize)collectionViewContentSize;//為每個item設置屬性-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath;//獲取制定范圍的所有item的屬性-(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect;-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds;

每次調用會清空colsHeight數組里的信息:

//完成布局前的初始工作-(void)prepareLayout{ [super prepareLayout]; self.colWidth =( self.collectionView.frame.size.width - (colCount+1)*colMargin )/colCount; //讓它重新加載 self.colsHeight = nil;}通過遍歷colHeight數組里的所有列來獲得最長的那一列,返回contentsize//collectionView的內容尺寸-(CGSize)collectionViewContentSize{ NSNumber * longest = self.colsHeight[0]; for (NSInteger i =0;i<self.colsHeight.count;i++) {  NSNumber* rolHeight = self.colsHeight[i];  if(longest.floatValue<rolHeight.floatValue){   longest = rolHeight;  } } return CGSizeMake(self.collectionView.frame.size.width, longest.floatValue);}

每個cell要出來時這個方法會被調用,在此方法中設置該cell的frame。

注意heightBlock是外部控制器傳進來的block用以計算每個cell的高度,現在我只是設置了隨機數。如果沒有傳block進來我這里直接讓他崩潰了。

//為每個item設置屬性-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{ UICollectionViewLayoutAttributes* attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; NSNumber * shortest = self.colsHeight[0]; NSInteger shortCol = 0; for (NSInteger i =0;i<self.colsHeight.count;i++) {  NSNumber* rolHeight = self.colsHeight[i];  if(shortest.floatValue>rolHeight.floatValue){   shortest = rolHeight;   shortCol=i;  } } CGFloat x = (shortCol+1)*colMargin+ shortCol * self.colWidth; CGFloat y = shortest.floatValue+colMargin;  //獲取cell高度 CGFloat height=0; NSAssert(self.heightBlock!=nil, @"未實現計算高度的block "); if(self.heightBlock){  height = self.heightBlock(indexPath); } attr.frame= CGRectMake(x, y, self.colWidth, height); self.colsHeight[shortCol]=@(shortest.floatValue+colMargin+height);  return attr;}
//獲取所有item的屬性-(NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{ NSMutableArray* array = [NSMutableArray array]; NSInteger items = [self.collectionView numberOfItemsInSection:0]; for (int i = 0; i<items;i++) {  UICollectionViewLayoutAttributes* attr = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];  [array addObject:attr]; } return array;}

實現下列方法會在出現新的cell時重新布局并調用preparelayout方法

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{ return YES;}

每列高度的存放,初始高度可以改,我這里是0

-(NSMutableArray *)colsHeight{ if(!_colsHeight){  NSMutableArray * array = [NSMutableArray array];  for(int i =0;i<colCount;i++){   //這里可以設置初始高度   [array addObject:@(0)];  }  _colsHeight = [array mutableCopy]; } return _colsHeight;}

再來看看控制器里就是這么簡單

#pragma mark getter-setter-(UICollectionView *)collectionView{ if(!_collectionView){  _collectionView = [[UICollectionView alloc]initWithFrame:self.view.frame collectionViewLayout:self.layout];  _collectionView.backgroundColor = [UIColor whiteColor];  _collectionView.delegate=self;  _collectionView.dataSource=self;  [_collectionView registerClass:[CollectionViewCell class] forCellWithReuseIdentifier:identifer]; } return _collectionView;}-(UICollectionViewLayout *)layout{ if(!_layout){  _layout = [[WaterfallCollectionLayout alloc]initWithItemsHeightBlock:^CGFloat(NSIndexPath *index) {   return [self.heightArr[index.item] floatValue];  }];   } return _layout;}-(NSArray *)heightArr{ if(!_heightArr){  //隨機生成高度  NSMutableArray *arr = [NSMutableArray array];  for (int i = 0; i<100; i++) {   [arr addObject:@(arc4random()%50+80)];  }  _heightArr = [arr copy]; } return _heightArr;}

關于瀑布流的文章特別多,本文就是為大家分享了IOS簡單實現瀑布流的方法,希望對大家的學習有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本中文字幕久久看| 日韩不卡在线观看| 亚洲国产欧美一区二区丝袜黑人| 欧美电影《睫毛膏》| 在线播放日韩av| 欧美视频免费在线观看| 7777kkkk成人观看| 久久精品视频网站| 久久中文久久字幕| 国产成+人+综合+亚洲欧美丁香花| 欧美电影免费观看高清完整| 亚洲国产精品yw在线观看| 亚洲成人网在线| 亚洲自拍中文字幕| 国产91精品青草社区| 亚洲free嫩bbb| 国产精品大片wwwwww| 久久久久久久国产| 另类色图亚洲色图| 欧美大尺度电影在线观看| 色视频www在线播放国产成人| 精品无码久久久久久国产| 精品亚洲一区二区三区四区五区| 国产精品免费一区二区三区都可以| 精品二区三区线观看| 日韩美女视频中文字幕| 欧美成人h版在线观看| 日韩亚洲精品电影| 91久久精品久久国产性色也91| 97视频在线免费观看| 国产精品88a∨| 亚洲午夜av电影| 国产性猛交xxxx免费看久久| 日韩二区三区在线| 国产女同一区二区| 久久精品中文字幕一区| 亚洲色图在线观看| 欧美成人在线免费视频| 精品福利樱桃av导航| 色婷婷成人综合| 久久久精品美女| 成人福利免费观看| 色播久久人人爽人人爽人人片视av| 精品高清美女精品国产区| 国产精品色视频| www.国产精品一二区| 中文字幕日韩精品在线观看| 亚洲欧美日韩中文在线制服| 国产日韩欧美另类| 日本精品久久中文字幕佐佐木| 成人福利在线观看| 亚洲综合社区网| 久久久久久av| 亚洲**2019国产| 在线播放精品一区二区三区| 欧美电影免费观看电视剧大全| 日韩精品在线电影| 超碰91人人草人人干| 精品毛片网大全| 国产成人极品视频| 欧美性极品少妇精品网站| 一色桃子一区二区| 日韩欧中文字幕| 欧美性色xo影院| 国产性猛交xxxx免费看久久| 久久久久免费精品国产| 欧美成人剧情片在线观看| 欧美大片在线免费观看| www.欧美三级电影.com| 国产精品自产拍在线观看| 色悠悠久久久久| 日本欧美国产在线| 日韩av理论片| 国产日韩欧美在线视频观看| 日韩精品高清在线| 91欧美激情另类亚洲| 欧美电影免费看| 日韩av手机在线看| 国产精品69久久久久| 91成人在线视频| 久久精品夜夜夜夜夜久久| 日韩中文在线中文网在线观看| 欧亚精品中文字幕| 成人欧美一区二区三区黑人孕妇| 日日摸夜夜添一区| 日韩成人性视频| 久久视频在线视频| 中文字幕欧美视频在线| 久久久久久久久国产精品| 国产精品久久久久久久久久ktv| 亚洲人成网站999久久久综合| 日韩有码在线播放| 精品国内产的精品视频在线观看| 亚洲人成绝费网站色www| 国产在线精品成人一区二区三区| 国产手机视频精品| 国产精品v片在线观看不卡| 亚洲国产精品一区二区久| 亚洲iv一区二区三区| 欧美有码在线视频| 国产丝袜精品第一页| 日本高清不卡在线| 久久视频在线播放| 8x拔播拔播x8国产精品| 欧美性高潮在线| 国产日韩综合一区二区性色av| 91亚洲精品一区二区| 日韩男女性生活视频| 精品亚洲永久免费精品| 欧洲成人在线观看| 亚洲第一av网站| 91久久久久久久久| 久久手机精品视频| 国产成人一区三区| 国产欧美va欧美va香蕉在线| 91亚洲一区精品| 国产精品免费福利| 91精品久久久久久久久久另类| 亚洲乱码av中文一区二区| 久久久久久亚洲精品中文字幕| 国产91色在线播放| 欧美日韩国产页| 亚洲深夜福利视频| 蜜臀久久99精品久久久无需会员| zzijzzij亚洲日本成熟少妇| 欧美资源在线观看| 国产综合在线观看视频| 国产欧美精品xxxx另类| 欧美一级高清免费播放| 日韩中文字幕欧美| 久久亚洲精品一区| 视频直播国产精品| 国产精品一区二区久久久| 日韩亚洲一区二区| 日韩电影大片中文字幕| 高清亚洲成在人网站天堂| 午夜欧美大片免费观看| 在线精品视频视频中文字幕| 亚洲片在线观看| 欧美高清性猛交| 2019亚洲日韩新视频| 亚洲精品97久久| 国产精品一区电影| 国产日韩欧美日韩| 美日韩精品免费视频| 日韩av网站大全| 精品国产一区二区三区久久狼黑人| 日韩精品中文字幕视频在线| 日韩欧美有码在线| 日韩麻豆第一页| 米奇精品一区二区三区在线观看| 国产一区二区三区毛片| 亚洲欧美日韩图片| 一区二区在线视频| 亚洲精品在线91| 国产成人精品免费久久久久| 国产精品一区二区女厕厕| 久久韩剧网电视剧| 在线电影中文日韩| 国产丝袜一区视频在线观看| 亚洲大胆人体av| 成人性生交大片免费看小说| 久久中文精品视频| 日韩一区二区av|