UICollectionView

取消UICollectionView的隐式动画
UICollectionView在reloadItems的时候,默认会附加一个隐式的fade动画
怎样在UICollectionView中添加Header和footer
在最后面
No index path for table cell being reused 这个问题

 自定制Footer header 需要注意的地方
 self.tableView.tableFooterView = footCell.contentView;

目录

  • 布局相关
  • UICollectionViewDelegateFlowLayout
  • UICollectionViewDataSource
  • UICollectionViewDelegate
补充:

当cell很少的情况下(没有占满屏幕),collectionView不能拖动,这个时候就不能拖拽collectionView进行下拉刷新了吗?

解决方法:这个问题已经解决,一直忘了回来写出来。我发现 当所有collectionCell的高度和没有占满整个parent container的时候,当下拉的时候都不会触发scrollViewDidScroll。所以在创建collectionView的时候添加   
self.collectionView.alwaysBounceVertical =YES;

UICollectionView底部被标签了控制器(tabBar)遮挡的解决办法

//创建CollectionView时高度减少113(tabBar的高度)
 垂直方向滚动
 self.collectionV = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, self.view.width, self.view.height-108) collectionViewLayout:flowLayout];

水平方向滚动
//创建CollectionView时高度减少49(tabBar的高度)
 self.collectionV = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, self.view.width, self.view.height-49) collectionViewLayout:flowLayout];
//关闭约束,不设置也可以
 self.automaticallyAdjustsScrollViewInsets = NO;
 //高度的间距设置49
 self.collectionV.contentInset = UIEdgeInsetsMake(49, 0, 0, 0);

布局相关

UICollectionViewLayou

  • UICollectionViewLayout是所有的collectionView的布局类的父类,这个类只是为了被继承而创建的类,不能直接使用它来创建对象;要使用的是它的子类;子类的作用就是自动布局collectionView的cell

  • UICollectionViewFlowLayout:UICollectionViewLayout 以瀑布流的形式自动布局的一个布局类所有和布局相关的属性,全部都由这个布局对象来进行设置

1.创建UICollectionViewLayou

 UICollectionViewFlowLayout * flowLayout = [[UICollectionViewFlowLayout alloc] init];

2.设置cell的大小(所有的cell的宽度和高度都是一样的)

  flowLayout.itemSize = CGSizeMake(100, 200);

3.设置滚动方向

  UICollectionViewScrollDirectionVertical,  垂直方向(默认)
  UICollectionViewScrollDirectionHorizontal 水平方向
  
  [flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical];
    

通过布局对象去创建collectionView对象

UICollectionView 继承 UIScrollView

1.创建UICollectionView

//参数1:frame
//参数2:布局样式

 UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout];

2.设置代理

 collectionView.dataSource = self;
 collectionView.delegate = self;

3.注册cell(告诉collectionView在自动创建cell的时候,需要创建什么样的cell)

注意:
如果想要将一个子视图直接添加到cell上,必须通过cell的contentView去调用addSubview方法,添加到内容视图上

 [collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cell"];

 //注册headerView
 [collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"view"];

6.设置背景颜色(默认是黑色)

 collectionView.backgroundColor = [UIColor whiteColor];

UICollectionViewDelegateFlowLayout

设置协议

@interface ViewController ()< UICollectionViewDelegateFlowLayout>

设置每个cell的宽和高

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
        
    return CGSizeMake(W, 150);
}

设置间距

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{

    top, left, bottom, right
    return UIEdgeInsetsMake(0, 0, 0, 0);
}

设置最小行间距(默认是10)
如果collectionView纵向滚动,行间距只能通过设置最小行间距来确定

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{

    return 0;
    
}

设置最小列间距(默认是10)
如果collectionView横向滚动,列间距只能通过设置最小列间距来确定

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{

    return 0;
}

设置header的大小

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{

    //如果是纵向滚动,设置header的宽度是无效;如果是横向滚动,设置header的高度无效
    return CGSizeMake(100, 50);
}

UICollectionViewDataSource

设置协议

@interface ViewController ()

设置分组数(默认1)

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{

    return 3;
    
}

设置每一组cell的个数(组数默认是1)

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{

    return 50;
    
}

创建cell
//参数1:委托
//参数2:cell的位置(第几组(section)的第几个(item))

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    //1.去复用池中查看有没有可以复用的cell;如果找到了就直接将可以复用的cell的地址返回。没有找到就自己创建一个新的cell(前提:要告诉collectionView在自动创建新的cell的时候,需要创建什么类的,复用ID是什么)
    //参数1:复用ID
    //参数2:当前需要创建的cell的位置
    UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
    
    //2.刷新数据
    cell.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0f green:arc4random()%256/255.0f blue:arc4random()%256/255.0f alpha:1];
    

    //3.返回cell
    return cell;
    
    
}

设置collectionView的headerView和footerView

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{

    //1.去复用池中找,有没有可以复用的headerView;如果没有的话,collectionView会自动创建一个新的headerView
    //参数1:类型(是headerview还是footerView)
    //UICollectionElementKindSectionHeader (headerview)
    //UICollectionElementKindSectionFooter (footerView)
    //参数2:复用ID
    //参数3:位置
    UICollectionReusableView * headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"view" forIndexPath:indexPath];
    
    //2.更新数据
    headerView.backgroundColor = [UIColor yellowColor];
    
    
    return headerView;
    
}

UICollectionViewDelegate

设置协议

@interface ViewController ()
pragma mark collectionView Delegate

当cell被选中的时候会调用这个方法

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

    NSLog(@"第%ld组,第%ld个",indexPath.section, indexPath.item);
}

设置headerView

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{

    //1.去复用池找可以复用的headerView
    DateHeaderReusableView * headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"view" forIndexPath:indexPath];
    
    //2.刷新数据
    NSArray * array = @[@"热门作者", @"热门条漫", @"热门绘本"];
//    headerView.backgroundColor = [UIColor redColor];
    headerView.headerTitleLabel.text = array[indexPath.section];
    
    //3.返回
    return headerView;
}
切换collectionViewLayout布局

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([self.collectionView.collectionViewLayout isKindOfClass:[ZBCollectionViewLineLayout class]])
    {
        ZBGridLayout *gridLayout = [[ZBGridLayout alloc]init];
        [self.collectionView setCollectionViewLayout:gridLayout animated:YES];
    }
    else
    {
        [self.collectionView setCollectionViewLayout:_flowLayout animated:YES];
    }
}

你可能感兴趣的:(UICollectionView)