博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios开发之--UICollectionView的使用
阅读量:6574 次
发布时间:2019-06-24

本文共 5566 字,大约阅读时间需要 18 分钟。

最近项目中需要实现一种布局,需要用到UICollectionView,特在此整理记录下!

贴上最终实现的效果图:

 

1,声明

@interface FirstViewController ()
@property(nonatomic,strong)UICollectionView *myCollectionView;@property(nonatomic,strong)UICollectionViewFlowLayout *myLayout;

2,创建

a,设置一个背景图片

UIImageView *imgV = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bgImg2.jpg"]];    imgV.frame = CGRectMake(0, 0, KscreenW, KscreenH);    imgV.autoresizingMask = UIViewAutoresizingFlexibleWidth;    [self.view insertSubview:imgV atIndex:0];

b,创建UICollectionView和FlowLayout

-(void)creatUI{    self.myLayout = [[UICollectionViewFlowLayout alloc]init];    self.myLayout.minimumLineSpacing = 50;    self.myLayout.minimumInteritemSpacing = 1;    self.myLayout.itemSize = CGSizeMake(KscreenW/2-1, (KscreenW/2)+50);    self.myLayout.sectionInset = UIEdgeInsetsMake(0, 0, 20, 0);        self.myCollectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, KscreenW, KscreenH-30) collectionViewLayout:self.myLayout];    self.myCollectionView.delegate = self;    self.myCollectionView.dataSource = self;    self.myCollectionView.backgroundColor = [UIColor clearColor];//    注册cell    [self.myCollectionView registerNib:[UINib nibWithNibName:@"LeftCell" bundle:nil] forCellWithReuseIdentifier:@"LeftCell"];    [self.myCollectionView registerNib:[UINib nibWithNibName:@"RightCell" bundle:nil] forCellWithReuseIdentifier:@"RightCell"];    [self.myCollectionView registerNib:[UINib nibWithNibName:@"PublickCell" bundle:nil] forCellWithReuseIdentifier:@"PublickCell"];//    注册头视图    [self.myCollectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"SECTION_ONE"];    [self.myCollectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"SECTION_TWO"];            [self.view insertSubview:self.myCollectionView atIndex:1];}

c,这里我用了三种自定义cell,上面的方法有具体的注册cell方法,还有头视图的注册

3,具体代理方法的实现

-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{    return 2;}-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{    if (section == 0) {                return 6;    }else{                return 6;    }}-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{    if (indexPath.section == 0) {        if (indexPath.item %2 == 0) {                        LeftCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LeftCell" forIndexPath:indexPath];            cell.backgroundColor = [UIColor clearColor];            return cell;        }else{            RightCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"RightCell" forIndexPath:indexPath];            cell.backgroundColor = [UIColor whiteColor];            return cell;        }    }else{                PublickCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PublickCell" forIndexPath:indexPath];        cell.backgroundColor = [UIColor whiteColor];                return cell;    }        return nil;}

比较简单!

4,创建头视图,PS:这里需要注意个问题:多组头部视图样式不一样复用时发生错乱问题,代码如下:

a,注册头视图,有两种方法:

// 防止cell和头部视图复用出现错乱    [collectionView registerClass:[WOCOHomeSelectTypeCell class] forCellWithReuseIdentifier:@"SECTION_ONE"];    [collectionView registerClass:[WOCOHomeDisplayCell class] forCellWithReuseIdentifier:@"SECTION_TWO"];    [collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"SECTION_ONE"];    [collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"SECTION_TWO"];

这两种方法都可以!

b,代理方法的实现:

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{//    防止重用,定义重用标识符    static NSString *reusableID;    if (indexPath.section == 0) {        reusableID = @"SECTION_ONE";    }else{        reusableID = @"SECTION_TWO";    }            UICollectionReusableView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:reusableID forIndexPath:indexPath];    header.backgroundColor = [UIColor clearColor];        if (indexPath.section == 0) {        headImg = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, KscreenW, 150)];        headImg.image = [UIImage imageNamed:@"topLog"];        [header addSubview:headImg];                bottomImg = [[UIImageView alloc]initWithFrame:CGRectMake(KscreenW/2-150/2, 180, 150, 50)];        bottomImg.image = [UIImage imageNamed:@"sj"];        [header addSubview:bottomImg];            }else{                UIImageView *bottomImg2 = [[UIImageView alloc]initWithFrame:CGRectMake(KscreenW/2-150/2, 15, 150, 50)];        bottomImg2.image = [UIImage imageNamed:@"sj1"];        [header addSubview:bottomImg2];    }        return header;}

此方法设置了一个str,作为标识符对不同的section进行标记,这样就可以解决重用的问题,根据不同的id进入不同的section,避免了头视图上面的内容多次创建,各自创建各自的!

c,设置不同section的高度,只需要实现此代理方法即可:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{    if (section == 0) {        return CGSizeMake(KscreenW, 250);    }else{        return CGSizeMake(KscreenW, 80);    }}

完成上面的操作,就可以在不同的section之间随意操作了!

 

转载于:https://www.cnblogs.com/hero11223/p/7419651.html

你可能感兴趣的文章
Android控件之HorizontalScrollView 去掉滚动条
查看>>
UVM中的class--2
查看>>
任务调度器配置文件
查看>>
ORACLE 存储过程异常捕获并抛出
查看>>
HDU 4293 Groups (线性dp)
查看>>
博客园博客美化相关文章目录
查看>>
root用户重置其他密码
查看>>
关于查询扩展版ESI高被引论文的说明
查看>>
【iCore3应用】基于iCore3双核心板的编码器应用实例
查看>>
Oracle推断值为非数字
查看>>
得知发行组长老潘今天岗位上最后一天就要离开有感
查看>>
多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
查看>>
vue-cli中理不清的assetsSubDirectory 和 assetsPublicPath
查看>>
从JDK源码角度看Short
查看>>
解密Angular WebWorker Renderer (二)
查看>>
parceljs 中文文档24小时诞生记
查看>>
五年 Web 开发者 star 的 github 整理说明
查看>>
Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
查看>>
ReactNative字体大小不随系统字体大小变化而变化
查看>>
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>