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

首頁 > 系統(tǒng) > iOS > 正文

ios基于UICollectionView實(shí)現(xiàn)橫向瀑布流

2019-10-21 18:22:04
字體:
供稿:網(wǎng)友

在網(wǎng)上找了許久,一直沒有發(fā)現(xiàn)有提供橫向瀑布流效果的。在項(xiàng)目中用到了我就在垂直瀑布流的基礎(chǔ)上,進(jìn)行了修改,做出了橫向瀑布流的效果。同時(shí)也對一些UICollectionView的屬性進(jìn)行簡單的注釋,方便以后查閱。

1、首先要寫一個(gè)繼承與NSObject的布局類,記錄每一行(列)目前的寬度(高度)。再添加一個(gè)新的cell的時(shí)候進(jìn)行判斷比較,添加到最短的那一行或一列上。

2、橫向的布局類入下,垂直的話就是講對應(yīng)的X Y軸數(shù)據(jù)進(jìn)行調(diào)整即可。
WaterfallFlowLayout為布局類,繼承與NSObject。.h文件入下

#import <UIKit/UIKit.h>// 類的前置聲明@class WaterfallFlowLayout;@protocol WaterfallFlowLayoutDelegate <NSObject>// 動態(tài)獲取 item 寬度- (CGFloat) WaterfallFlowLayout:(WaterfallFlowLayout *) layout widthForItemAtIndexPath:(NSIndexPath *) indexPath;@end@interface WaterfallFlowLayout : UICollectionViewLayout@property (nonatomic,assign) id <WaterfallFlowLayoutDelegate> delegate;@property (nonatomic) NSInteger numberOfColumns;@property (nonatomic) CGFloat minimumLineSpacing;@property (nonatomic) CGFloat minimumInteritemSpacing;@property (nonatomic) UIEdgeInsets sectionInset;@end

WaterfallFlowLayout為布局類,繼承與NSObject。.m文件入下

#import "WaterfallFlowLayout.h"@interface WaterfallFlowLayout (){  // 用于記錄每一列布局到的寬度  NSMutableArray * _widthOfColumns;  // 用于保存所有item的屬性 (frame)  NSMutableArray * _itemsAttributes;}@end@implementation WaterfallFlowLayout- (void) setNumberOfColumns:(NSInteger)numberOfColumns {  if (_numberOfColumns != numberOfColumns) {    _numberOfColumns = numberOfColumns;    // 讓原有布局失效,需要重新布局    [self invalidateLayout];  }}- (void)setMinimumLineSpacing:(CGFloat)minimumLineSpacing {  if (_minimumLineSpacing != minimumLineSpacing) {    _minimumLineSpacing = minimumLineSpacing;    [self invalidateLayout];  }}- (void)setMinimumInteritemSpacing:(CGFloat)minimumInteritemSpacing {  if (_minimumInteritemSpacing != minimumInteritemSpacing) {    _minimumInteritemSpacing = minimumInteritemSpacing;    [self invalidateLayout];  }}- (void)setSectionInset:(UIEdgeInsets)sectionInset {  if (!UIEdgeInsetsEqualToEdgeInsets(_sectionInset, sectionInset)) {    _sectionInset = sectionInset;    [self invalidateLayout];  }}//重寫方法 1: 準(zhǔn)備布局-(void)prepareLayout {  [super prepareLayout];  // 真正的布局在這里完成  if (_itemsAttributes) {    [_itemsAttributes removeAllObjects];  }else {    _itemsAttributes = [[NSMutableArray alloc] init];  }  if (_widthOfColumns) {    [_widthOfColumns removeAllObjects];  }else {    _widthOfColumns = [[NSMutableArray alloc] init];  }  for (NSInteger i = 0; i < self.numberOfColumns; i++) {    // 初始化每一列的寬度(默認(rèn)為上邊距)//    _heightOfColumns[i] = @(self.sectionInset.top);    [_widthOfColumns addObject:@(self.sectionInset.left)];  }  // item的總數(shù)  NSInteger count = [self.collectionView numberOfItemsInSection:0];//  CGFloat itemWidth = (self.collectionView.frame.size.width - self.sectionInset.left - self.sectionInset.right - (_numberOfColumns-1) * _minimumInteritemSpacing )/_numberOfColumns;  // 總的高度 (集合視圖的寬度)  CGFloat totalHeight = self.collectionView.frame.size.height;  // 有效的高度 (出去間隔及邊界)  CGFloat validHeight = totalHeight - self.sectionInset.top - self.self.sectionInset.bottom - (self.numberOfColumns-1) * self.minimumInteritemSpacing;  // 每一個(gè)item的高度  CGFloat itemHeight = validHeight/self.numberOfColumns;  // 設(shè)置item的默認(rèn)寬度  CGFloat itemWidth = itemHeight;  for (NSInteger i = 0; i<count; i++) {    // 最短列的下標(biāo)    NSInteger index = [self indexOfShortestColumn];    CGFloat originY = self.sectionInset.top + index * (itemHeight +self.minimumInteritemSpacing);    CGFloat originX = [_widthOfColumns[index] floatValue];    // 構(gòu)造 indexPath    NSIndexPath * indexPath = [NSIndexPath indexPathForItem:i inSection:0];    // 動態(tài)的獲取寬度    if ([self.delegate respondsToSelector:@selector(WaterfallFlowLayout:widthForItemAtIndexPath:)]) {      itemWidth = [self.delegate WaterfallFlowLayout:self widthForItemAtIndexPath:indexPath];    }    UICollectionViewLayoutAttributes * attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];    attr.frame = CGRectMake(originX, originY, itemWidth, itemHeight);    // 保存 item 的屬性 到數(shù)組中    [_itemsAttributes addObject:attr];    // 更新布局到的一列(最短列) 的高度    _widthOfColumns[index] = @(originX + itemWidth + self.minimumLineSpacing);  }  // 刷新顯示  [self.collectionView reloadData];}//重寫方法 2: 返回指定區(qū)域的item的屬性(frame)- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {  NSMutableArray * array = [NSMutableArray array];  for (UICollectionViewLayoutAttributes * attr in _itemsAttributes) {    // 判斷兩個(gè)矩形是否有交集    if (CGRectIntersectsRect(attr.frame, rect)) {      [array addObject:attr];    }  }  return array;}//重寫方法 3: 返回內(nèi)容的尺寸-(CGSize)collectionViewContentSize {  CGFloat height = self.collectionView.frame.size.height;  NSInteger index = [self indexOfLongestColumn];  CGFloat width = [_widthOfColumns[index] floatValue] + self.sectionInset.right - self.minimumLineSpacing;  return CGSizeMake(width, height);}- (NSInteger) indexOfLongestColumn {  NSInteger index = 0;  for (NSInteger i = 0; i<_numberOfColumns; i++) {    if ([_widthOfColumns[i] floatValue] > [_widthOfColumns[index] floatValue]) {      index = i;    }  }  return index;}- (NSInteger) indexOfShortestColumn {  NSInteger index = 0;  for (NSInteger i = 0; i<_numberOfColumns; i++) {    if ([_widthOfColumns[i] floatValue] < [_widthOfColumns[index] floatValue]) {      index = i;    }  }  return index;}@end

3、上邊的這個(gè)布局類可以直接復(fù)制粘貼下來。然后就是創(chuàng)建你的UICollectionView 

在collectionView的cell中可以直接創(chuàng)建imageView或者是label添加到cell上,用來顯示數(shù)據(jù)。 
collectionView默認(rèn)section縮進(jìn)左右是0 
調(diào)節(jié)橫向cell間距 
layout.minimumLineSpacing = 10; 
調(diào)節(jié)縱向cell間距 
layout.minimumInteritemSpacing = 20; 
調(diào)節(jié)瀑布流顯示的行數(shù),當(dāng)然了你的collectionView的高(寬)足夠顯示幾行(列)就會自動顯示多上行(列); 
layout.numberOfColumns = 3;

#import "RootViewController.h"#import "WaterfallFlowLayout.h"@interface RootViewController () <UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,WaterfallFlowLayoutDelegate>{  UICollectionView * _collectionView;}@end@implementation RootViewController- (void)dealloc {  [_collectionView release];  [super dealloc];}- (void)viewDidLoad {  [super viewDidLoad];  // 創(chuàng)建集合視圖  [self createCollectionView];}- (UICollectionViewLayout *)createLayout {#if 1  WaterfallFlowLayout * layout = [[WaterfallFlowLayout alloc] init];  layout.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20);  layout.minimumLineSpacing = 10;  layout.minimumInteritemSpacing = 20;  layout.numberOfColumns = 3;  layout.delegate = self;  [self performSelector:@selector(changeLayout:) withObject:layout afterDelay:3];#else  UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init];  layout.minimumLineSpacing = 10;  layout.itemSize = CGSizeMake(150, 100);  layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);#endif  return [layout autorelease];}- (void)changeLayout:(WaterfallFlowLayout *)layout {  layout.numberOfColumns = 3;}- (void)createCollectionView {  CGRect frame = CGRectMake(0, 20, VIEW_WIDTH, VIEW_HEIGHT-20);  _collectionView = [[UICollectionView alloc] initWithFrame:frame collectionViewLayout:[self createLayout]];  _collectionView.backgroundColor = [UIColor cyanColor];  // 設(shè)置代理  _collectionView.delegate = self;  _collectionView.dataSource = self;  // 注冊cell 類型 及 復(fù)用標(biāo)識  [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellId"];  [self.view addSubview:_collectionView];}#pragma mark - UICollectionViewDataSource- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {  return 102;}- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {  UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellId" forIndexPath:indexPath];  UILabel * label = nil;  NSArray * array = cell.contentView.subviews;  if (array.count) {    label = array[0];  }else {    label = [[UILabel alloc] init];//    label.frame = cell.bounds;    label.textAlignment = NSTextAlignmentCenter;    label.font = [UIFont systemFontOfSize:50];    [cell.contentView addSubview:label];    [label release];  }  label.frame = cell.bounds;  label.text = [NSString stringWithFormat:@"%ld",indexPath.item];  label.textColor = [UIColor whiteColor];  cell.backgroundColor = RandomColor;  return cell;}- (CGSize) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {  return CGSizeMake( arc4random()%100+200, 110);}-(CGFloat) WaterfallFlowLayout:(WaterfallFlowLayout *)layout widthForItemAtIndexPath:(NSIndexPath *)indexPath{  return arc4random()%150+50;}-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{  NSLog(@"點(diǎn)擊了第 %ld 組,第 %ld 行",indexPath.section,indexPath.row);}- (void)didReceiveMemoryWarning {  [super didReceiveMemoryWarning];}@end

實(shí)現(xiàn)的效果如下 

ios,UICollectionView,瀑布流

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VEVB武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到IOS開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
欧美亚一区二区三区| aaa在线免费观看| 91精品欧美综合在线观看最新| 精品国产va久久久久久久| 在线观看视频h| 成人短剧在线观看| 久久久久久久网站| 亚洲都市激情| 午夜精品亚洲一区二区三区嫩草| 91玉足脚交白嫩脚丫| 亚洲成人av电影| 亚洲午夜久久久久久久久电影院| 日韩精品视频观看| 无限国产资源| 日韩城人网站| 国产视频精选在线| 国产bdsm| 热99re久久精品精品免费| 日韩精品一区二区在线播放| 国产伦精品一区二区三区免费| 美女又爽又黄免费动漫| 95视频在线观看| 日韩精品一区在线| 香蕉视频国产在线| 亚洲一区二区三区美女| 久久久久9999亚洲精品| 中文在线免费一区三区| 最近2019年手机中文字幕| 国内自拍视频在线观看| 亚洲一级黄色录像| 亚洲国产成人爱av在线播放| 97精品国产综合久久久动漫日韩| 99在线免费视频| 麻豆中文字幕在线观看| 天堂网avav| 强制捆绑调教一区二区| 678在线观看视频| 免费看成人哺乳视频网站| 国产精品香蕉视屏| 久久艹免费视频| 中文精品电影| 在线观看欧美| 欧美性少妇18aaaa视频| 色婷婷国产精品久久包臀| 亚洲视频在线观看一区| 国内久久视频| 波多野结衣av在线观看| 欧美精品久久久久久久久25p| 亚洲综合精品视频| 久久国产乱子精品免费女| 午夜av区久久| 136福利第一导航国产在线| 成人免费网站黄| 一本久道综合色婷婷五月| 久久综合国产精品台湾中文娱乐网| 性高潮视频在线观看| 亚洲精品菠萝久久久久久久| 久久久久99人妻一区二区三区| 久久99精品一区二区三区| 久久手机视频| 免费看成人片| 欧美影院一区二区| 91在线亚洲| 国产夫绿帽单男3p精品视频| 欧美色综合网| 五码日韩精品一区二区三区视频| 午夜精品一区| 亚洲精品美女91| 国产精品1000部啪视频| 亚洲.欧美.日本.国产综合在线| 国产 日韩 欧美| 试看120秒一区二区三区| 中文字幕一区二区人妻电影| 特级毛片www| 激情亚洲另类图片区小说区| 国产一区深夜福利| 欧一区二区三区| 高清在线观看日韩| 欧美亚洲一区二区在线| 精品国产一区二区三区不卡蜜臂| 欧美精品无码一区二区三区| 欧美,日韩,国产在线| 欧美日韩国产小视频| 欧美另类老肥妇| 国产精品欧美激情在线观看| 欧美激情办公室videoshd| 欧美午夜性视频| 精品一区二区三区四区五区六区| 中文字幕在线欧美| 欧美自拍大量在线观看| 四虎8848精品成人免费网站| 亚洲欧美网站在线观看| 99国产精品无码| 黑丝av在线播放| 毛片av中文字幕一区二区| 国产在线xxxx| 日本一卡二卡在线| 九九热精品免费视频| 精品人妻一区二区三区日产| 亚洲最大成人网色| 三年中文在线观看免费大全中国| 无限资源日本好片| 亚洲国产视频网站| 好吊操视频这里只有精品| 亚洲一本大道在线| 午夜精品免费看| 欧美成人性色生活仑片| 欧美性色19p| 欧美激情中文不卡| 久久精品国产久精国产爱| 在线免费观看亚洲视频| 国产丝袜自拍| 欧美高清性粉嫩交| 日韩电影中文字幕在线| 精品国产亚洲一区二区在线观看| 日韩有码在线视频| 欧美日韩一区二区免费在线观看| 亚洲一区二区三区中文字幕在线观看| 18aaaa精品欧美大片h| 久久99久久久久久| 麻豆一区在线观看| 欧美在线免费观看亚洲| 成人av免费播放| 一区二区视频在线免费| 精品一区二区在线播放| 亚洲第一网站男人都懂| 亚洲人免费视频| 日本欧美一区二区在线观看| 黄网站app在线观看下载视频大全官网| 成人免费毛片aaaaa**| aa免费在线观看| 久久久精品国产| 欧美超碰在线观看| 小早川怜子一区二区的演员表| 亚洲a中文字幕| av女片在线| 色综合天天综合网国产成人综合天| 黄色精品视频| 一级片免费在线| 一本色道久久综合亚洲精品按摩| 国产无遮挡又黄又爽免费网站| 欧美日韩三级在线| 男人天堂亚洲天堂| 久久久精品一区二区三区| 日本免费一区二区三区视频| 国产在线拍揄自揄拍无码| www天堂在线观看| 男人皇宫亚洲男人2020| 欧美一区午夜视频在线观看| 国产精品丝袜久久久久久消防器材| 欧美精品久久久久久久多人混战| 国产中文伊人| 欧美午夜精品久久久久久蜜| 999在线观看免费大全电视剧| www免费网站在线观看| 九色视频网站在线观看| 日韩午夜视频在线观看| 国产无码精品一区二区| 中文字幕在线播放网址| 日本免费一区二区三区等视频| 秋霞电影一区二区| 自拍偷拍亚洲视频| aa一级黄色片| 91九色在线免费视频| 久久91在线| 国精产品久拍自产在线网站| 成人亚洲精品777777大片| 久久久人成影片一区二区三区观看| 久久91超碰青草在哪里看| 性做爰过程免费播放| 99热这里只有精品4| 久久精品国产成人一区二区三区| 999久久欧美人妻一区二区| 蜜桃精品在线观看| 国外成人在线视频网站| 欧美视频在线免费播放| 久久手机免费观看| 久久久久久久久久网| 日本精品在线免费观看| 免费日本一区二区三区视频| 欧美自拍偷拍第一页| 一区二区三区不卡视频| 国产卡一卡二在线| 日韩综合另类| 国产精品入口麻豆| 久久在线视频免费观看| www红色一片_亚洲成a人片在线观看_| 日本www在线观看视频| 日本va中文字幕| 国产免费久久精品| 亚洲人成网www| 国产成人手机视频| 9191精品国产综合久久久久久| 国产三级在线观看视频| 日韩精品一区二区三区电影| 天天做夜夜爱爱爱| 欧美亚洲大陆| 亚洲aⅴ优女av综合久久久| 久色国产在线| 成人av毛片在线观看| 超碰97免费在线| 国产主播在线看| 成人xxxxx| 偷窥韩漫第三季| 久久99久久亚洲国产| 伊人在线视频观看| 日本免费一区二区三区等视频| 福利片免费在线观看| 久久久国产一区二区三区四区小说| 国产精品久久久久久久天堂第1集| 国产尤物精品| 国产精品69久久久久孕妇欧美| www.国产成人| 亚洲精品一区二区三区蜜桃| 欧美日韩性生活| av毛片在线免费看| 中国china体内裑精亚洲片| 欧美大片1688网站| 欧美老年两性高潮| 五月天婷婷丁香网| 成人区一区二区| 国产熟女高潮一区二区三区| 1区1区3区4区产品乱码芒果精品| 日韩福利视频导航| 91资源在线观看| 午夜免费福利小电影| 黄色在线观看www| 一区二区三区**美女毛片| 天堂va欧美ⅴa亚洲va一国产| 91蝌蚪九色| 国产一区在线免费| 久久视频精品| 久久精品国产亚洲高清剧情介绍| 性高爱久久久久久久久| 美女国内精品自产拍在线播放| 国产精选久久| 美女又黄又免费| 国产乱子伦一区二区三区国色天香| 国产精品第一国产精品| 精品国产91久久久久久浪潮蜜月| 少妇人妻在线视频| 老司机精品视频在线播放| 人妻av一区二区| 思思99精品视频在线观看| 国产在线拍揄自揄拍无码| 日本老熟妇毛茸茸| 亚洲无线一线二线三线区别av| 国产一区二区麻豆| 草莓视频丝瓜在线观看丝瓜18| 久久久精品午夜少妇| 日本一区二区免费不卡| 亚洲专区一区二区三区| 国产精品一区二区在线播放| 欧美污在线观看| 97人人模人人爽人人喊38tv| 2001个疯子在线观看| 欧美精品一二三| 性欧美极品另类| 麻豆天美蜜桃91| 中文字幕一区二区三区中文字幕| 欧美一区二区三区另类| 国产三级做爰在线观看| 中文文字幕文字幕高清| 精品深夜av无码一区二区老年| 芬兰videosfree性少妇| 亚洲精品中文字幕乱码| 欧美精品在线一区| 欧美熟妇交换久久久久久分类| 蜜桃视频一区二区| 欧美极品jizzhd欧美仙踪林| 夜夜嗨av一区二区三区免费区| 中字幕一区二区三区乱码| 日本精品视频一区二区三区| www.狠狠色.com| 日韩av电影手机在线| 一级特黄免费视频| 日韩欧美亚洲国产精品字幕久久久| 91亚洲成人| 99久久精品免费看国产| av资源在线免费观看| 97香蕉久久夜色精品国产| 69堂免费精品视频在线播放| 一区二区三区波多野结衣在线观看| 91免费精品视频| 在线观看91久久久久久| 精品国产乱码一区二区| 欧洲毛片在线| 午夜在线观看91| 激情综合久久| 欧美婷婷六月丁香综合色| 国产三级三级看三级| 亚洲av成人无码网天堂| 亚洲国产天堂久久国产91| 欧美三级日本三级少妇99| 欧美三级超在线视频| 久久天天躁狠狠躁夜夜躁| 亚洲天堂一区在线观看| 一个人看的www一区| 免费在线看一区| 精品日韩欧美一区二区| 欧美性xxxxxbbbbbb精品| 欧美成人猛片aaaaaaa| 一区二区三区四区高清视频| 电影天堂最新网址| 青青草精品视频在线| 久久露脸国产精品| 中文字幕一区二区三区四区五区人| 3d动漫啪啪精品一区二区免费| 欧美jizz18性欧美| 日韩成人中文电影| 亚洲人成亚洲精品| а中文在线天堂| 综合色天天鬼久久鬼色| 国产精品一区亚洲| 国产精品久久久久久久久久久久冷| 欧美一区二区三区爽大粗免费| 欧美黑人猛交的在线视频| 日韩欧美中文字幕电影| 日本不卡一二区| 亚洲性无码av在线| 欧美精品成人一区二区在线观看| 日韩伦理在线视频| 久草综合在线观看| 91视频亚洲| 欧美日韩在线精品一区二区三区激情综| 免费欧美日韩| 国产精品66| 99精品视频在线观看播放|