CollectionView的基本用法(详细)

collectionView的介绍

UICollectionView的学习和UITableView的学习80%一模一样  
使用UITableView需要设置数据源和代理
UICollectionView的使用也需要设置数据源和代理
UITableView显示什么内容由数据源决定
想监听UITableView, 由代理决定
UICollectionView显示什么内容由数据源决定
UICollectionView监听由代理决定
UITableView的内容都显示到cell上
UICollectionView的内容也显示到cell上
自定义cell需要添加到contentView上
UICollectionView自定义cell也需要添加到contentView上
UICollectionView和UITableView都是继承于UIScrollView

注意点

one:
UICollectionView如何显示内容完全由layout(布局对象)决定
所以在创建UICollectionView时必须传递一个layout对象, 否则UICollectionView不知道如何显示
reason: 'UICollectionView must be initialized with a non-nil layout parameter'
two:
UICollectionViewLayout是一个抽象类, 如果使用UICollectionViewLayout类, 那么如何排布就必须由于我们自己来实现
所以一般情况使用UICollectionViewLayout的子类即可, 只有需要自定义cell显示样式时才需要定义一个类继承于UICollectionViewLayout来自己实现
UICollectionViewFlowLayout(流水布局): 该类是UICollectionViewLayout的子类, 系统以及提供了默认的实现

  • 由于UICollectioncView上的cell如何展示, 是由于layout对象决定的, 所以如果想修改cell的尺寸/间隙等, 都需要通过layout对象来修改

collectionView的使用步骤

1.必须要有布局,在初始化的时候就需要. (-init{})
2.必须注册cell(分为代码和Xib)
3.UICollectionView的cell是由布局决定
4.自定义cell
// 系统自带了流水布局,专门做九宫格
// UICollectionViewLayout基类,UICollectionViewFlowLayout是布局对象

初始化的注意点

  • 如果是继承于UICollectionViewController的话,初始化应该在- init方法中
  • 附上代码,文字比较抽象
Author :会跳舞的狮子
#pragma mark - 初始化
- (instancetype)init {

    //创建流水布局
    UICollectionViewFlowLayout *layout = ({
        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
        
        //设置间距
        NSInteger margin = 10;
        layout.minimumInteritemSpacing = margin;
        layout.minimumInteritemSpacing = margin;
        
        //设置item尺寸
        CGFloat itemW = (ScreenWidth - (MaxCol + 1) * margin) / MaxCol;
        CGFloat itemH = itemW;
        layout.itemSize = CGSizeMake(itemW, itemH);
        
        layout.sectionInset = UIEdgeInsetsMake(margin, margin, margin, margin);

        // 设置水平滚动方向
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
        
        layout;
    });
    //应该把layout添加到它父类的[initWithCollectionViewLayout:]里面
    if (self = [super initWithCollectionViewLayout:layout]) {
        
    }
    
    return self;
}
  • 如果不是继承UICollectionViewController,而是在ViewController里面里面添加一个CollectionView的话, 初始化就不需要在 init方法中

UICollectionViewFlowLayout的基本属性

// 创建流水布局
    // 默认滚动方向,垂直
    UICollectionViewFlowLayout *layout = ({
    
       UICollectionViewFlowLayout *layout = [[FlowLayout alloc] init];
        
        // 设置尺寸
        layout.itemSize = CGSizeMake(160, 160);
        
        //估算的尺寸(一般不需要设置)
        layout.estimatedItemSize = CGSizeMake(100, 100);
        
        //头部的参考尺寸(就是尺寸)
        layout.headerReferenceSize = CGSizeMake(100, 100);
        //尾部的参考尺寸
        layout.footerReferenceSize = CGSizeMake(100, 100);
        
        //设置分区的头视图和尾视图是否始终固定在屏幕上边和下边
        layout.sectionFootersPinToVisibleBounds = YES;
        layout.sectionHeadersPinToVisibleBounds = YES;
        
        // 设置水平滚动方向
        //水平滚动
        layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        //竖直滚动
        layout.scrollDirection = UICollectionViewScrollDirectionVertical;
        
        // 设置额外滚动区域
        layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
        
        // 设置cell间距
        //设置水平间距, 注意点:系统可能会跳转(计算不准确)
        layout.minimumInteritemSpacing = 50;
        //设置垂直间距
        layout.minimumLineSpacing = 50;
        
        layout;
        
    });

UICollectionView的基本属性

  // 创建UICollectionView
    // UICollectionView默认的颜色就是黑色,所以建议设置背景颜色
    UICollectionView *collectionView = ({
        
        //创建UICollectionView对象, 将layout添加到collectionViewLayout:里面
       UICollectionView *collectionView =  [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
        
        //设置UICollectionView的尺寸
        collectionView.bounds = CGRectMake(0, 0, self.view.bounds.size.width, 300);
        
        //设置背景颜色
        collectionView.backgroundColor = [UIColor greenColor];
        
        //设置中心点
        collectionView.center = self.view.center;

        // 设置数据源,展示数据
        collectionView.dataSource = self;
        //设置代理,监听
        collectionView.delegate = self;
        
        // 注册cell
        [collectionView registerNib:[UINib nibWithNibName:@"JHCell" bundle:nil] forCellWithReuseIdentifier:ID];
    
        /* 设置UICollectionView的属性 */
        //设置滚动条
        collectionView.showsHorizontalScrollIndicator = NO;
        collectionView.showsVerticalScrollIndicator = NO;
        
        //设置是否需要弹簧效果
        collectionView.bounces = NO;

        collectionView;
    
    });
    
     [self.view addSubview:collectionView];

数据源方法:

// 告诉系统一共多少组
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 3;
}

// 告诉系统每组多少个
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 100;
}

// 告诉系统每个Cell如何显示
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    // 1.从缓存池中取
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];

    /*
     注意:
     UICollectioncView的cell和UITableView的cell不太一样, 
     UITableView有默认的子控件
     UICollectionViewCell除了contentView以外, 没有提供默认的子控件
     设置UICollectionViewCell需要自定义 最好结合Xib使用
     */
    // 2.使用
    cell.backgroundColor = (indexPath.item % 2)?[UIColor redColor]:[UIColor greenColor];
    
    // 3.返回
    return cell;
}

UICollectionView的代理方法


#pragma mark -UICollectionViewDelegate
//UICollectionView被选中的时候调用
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%zd",indexPath.item);
}

// 返回这个UICollectionView是否可以被选择
- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;

}

UICollectionViewDelegateFlowLayout

  • UICollectionViewDelegateFlowLayout是UICollectionViewDelegate的子协议
  • 上面的方法在创建FlowLayout时静态的进行设置,如果我们需要动态的设置这些属性,我们可以通过代理来实现。
//动态设置每个Item的尺寸大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

//动态设置每个分区的EdgeInsets
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section;

//动态设置每行的间距大小
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;

//动态设置每列的间距大小
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;

//动态设置某组头视图大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;

//动态设置某组尾视图大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;

以上都是UICollectionView的基本用法,下一篇会写关于UICollectionView实现头部视图漂浮的效果

Author:会跳舞的狮子               一步一个脚印,积累点滴.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容