iOS

来源:互联网 发布:全国省市区sqlserver 编辑:程序博客网 时间:2024/06/05 11:57

一.简单介绍

UICollectionView 这个类是iOS6 新引进的API,它的布局更加灵活,简单来说就是多列的UITableView,那么UICollectionView的实现和UITableView的实现基本一样,也是存在datasource和delegate的,其中datasource为view提供数据源,告诉view要显示些什么东西以及如何显示它们,delegate提供一些样式的小细节以及用户交互的相应,除此之外UICollectionView还有一个不得不提的就是UICollectionViewLayout。

二.UICollectionView里面常用的方法(列举其中常用的,具体的请查看相关的API)

/** 使用class或者xib注册UICollectionViewCell*/- (void)registerClass:(nullable Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier;- (void)registerNib:(nullable UINib *)nib forCellWithReuseIdentifier:(NSString *)identifier;/** 先会从缓存池中取,如果没有会自动为我们创建cell,而不像之前那样还要我们自己去创建*/- (__kindof UICollectionViewCell *)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;/** 如果需要给每组的collectionview加上一个headerView或者footerView的话,就要用到这个方法,同样也是先从缓存池中取,没有自动创建,elementKind是需要创建的是头部还是底部两种类型*/- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;/** 总共多少组*/- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView;/** 每组中cell的个数*/- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;/** 每个cell的尺寸*/- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;/** 头部的尺寸*/-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section;/** 顶部的尺寸*/-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section;/** section的margin*/- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section ;/** 选中某一个cell*/- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;

三.用代码实现简单的collectionView

#pragma mark -- lazy load- (UICollectionView *)collectionView {    if (_collectionView == nil) {        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];        // 设置collectionView的滚动方向,需要注意的是如果使用了collectionview的headerview或者footerview的话, 如果设置了水平滚动方向的话,那么就只有宽度起作用了了        [layout setScrollDirection:UICollectionViewScrollDirectionVertical];      // layout.minimumInteritemSpacing = 10;// 垂直方向的间距     // layout.minimumLineSpacing = 10; // 水平方向的间距        _collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];        _collectionView.backgroundColor = [UIColor whiteColor];        _collectionView.dataSource = self;        _collectionView.delegate = self;    }    return _collectionView;}#pragma mark -- life cycle- (void)viewDidLoad {    [super viewDidLoad];    self.navigationItem.title = @"UICollectionView Demo";    self.navigationController.navigationBar.barTintColor = [UIColor redColor];    [self.view addSubview:self.collectionView];    // 注册collectionViewcell:WWCollectionViewCell是我自定义的cell的类型    [self.collectionView registerClass:[WWCollectionViewCell class] forCellWithReuseIdentifier:@"cell"];    // 注册collectionView头部的view,需要注意的是这里的view需要继承自UICollectionReusableView    [self.collectionView registerNib:[UINib nibWithNibName:@"WWCollectionReusableView" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];    // 注册collectionview底部的view,需要注意的是这里的view需要继承自UICollectionReusableView    [self.collectionView registerNib:[UINib nibWithNibName:@"WWCollectionFooterReusableView" bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"footer"];}#pragma mark -- UICollectionViewDataSource/** 每组cell的个数*/- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {    return 15;}/** cell的内容*/- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { WWCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];    cell.backgroundColor = [UIColor yellowColor];    cell.topImageView.image = [UIImage imageNamed:@"1"];    cell.bottomLabel.text = [NSString stringWithFormat:@"%zd.png",indexPath.row];}/** 总共多少组*/- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {    return 6;}/** 头部/底部*/- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{    if ([kind isEqualToString:UICollectionElementKindSectionHeader]) {        // 头部        WWCollectionReusableView *view =  [collectionView dequeueReusableSupplementaryViewOfKind :kind   withReuseIdentifier:@"header"   forIndexPath:indexPath];        view.headerLabel.text = [NSString stringWithFormat:@"头部 - %zd",indexPath.section];        return view;    }else {        // 底部        WWCollectionFooterReusableView *view =  [collectionView dequeueReusableSupplementaryViewOfKind :kind   withReuseIdentifier:@"footer"   forIndexPath:indexPath];        view.footerLabel.text = [NSString stringWithFormat:@"底部 - %zd",indexPath.section];        return view;    }}#pragma mark -- UICollectionViewDelegateFlowLayout/** 每个cell的尺寸*/- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{    return CGSizeMake(60, 60);}/** 头部的尺寸*/-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{    return CGSizeMake(self.view.bounds.size.width, 40);}/** 顶部的尺寸*/-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section{    return CGSizeMake(self.view.bounds.size.width, 40);}/** section的margin*/定义每个Section的四边间距- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {    return UIEdgeInsetsMake(5, 5, 5, 5);}#pragma mark -- UICollectionViewDelegate- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {    NSLog(@"点击了第 %zd组 第%zd个",indexPath.section, indexPath.row);}
//这个是两行cell之间的间距(上下行cell的间距)
 - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section;




//两个cell之间的间距(同一行的cell的间距)
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section;