UICollectionView

2018-07-11  本文已影响9人  每日总结

要创建一个UICollectionView,我们需要遵守三个协议

@interface ViewController()<UICollectionViewDelegate, 
                            UICollectionViewDataSource, 
                            UICollectionViewDelegateFlowLayout>
@end

接下来创建

//UICollectionViewLayout是CollectionView专门用于布局的类,UICollectionViewFlowLayout是它的子类,也是实际使用时用的类。
//这个子类可以初步实现自动横向排列item并在item排满之后自动换行
//如果需要自定义其他形式的布局,我们可以写一个UICollectionViewFlowLayout的子类进行设置
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
//要创建collectionView必须依赖于一个Layout
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 64, mWidth, mHeight-64) collectionViewLayout:flowLayout];
collectionView.delegate = self;
collectionView.dataSource = self;
[self.view addSubview:collectionView];

注册item

[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellID];
//如果需要自己设置SectionHeaderView及FooterView的话,也要注册一下
[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSecionHeader withReuseIdentifier:headerID];
[collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSecionFooter withReuseIdentifier:footerID];

实现协议方法

#pragma mark -----和tableView一样的三样
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
    return cell;
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return _count;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    //此方法中可以直接设定item的size
    return CGSizeMake(60,60);
}

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    //显示items的区域上下左右距离外部框架的距离
    return UIEdgeInsetsMake(10, 10, 10, 10);
}

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
    //根据kind的不同进行来设置不同的reusableView,headerView和footerView在这里设置
    UICollectionReusableView *reusableView;
    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {
        reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerID forIndexPath:indexPath];
        reusableView.backgroundColor = [UIColor orangeColor];
    } else {
        reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:footerID forIndexPath:indexPath];
        reusableView.backgroundColor = [UIColor greenColor];
    }
    return reusableView;
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
    //此方法中可直接设置headerView的size
    return CGSizeMake(mWidth, 40);
}

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section{
    //此方法中可直接设置footerView的size
    return CGSizeMake(mWidth, 20);
}

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
    //此方法中可处理item的点击事件
    //deleteItemsAtIndexPaths方法可以删除指定indexPath的item,但此方法会重走一遍上面初始化的代理方法,所以要更改相应的值,以免报错
    _count -= 1;
    [collectionView deleteItemsAtIndexPaths:@[indexPath]];
}

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath{
    //此方法中返回的是item是否点击高亮
    return NO;
}
上一篇下一篇

猜你喜欢

热点阅读