美文网首页
UICollectionView

UICollectionView

作者: 每日总结 | 来源:发表于2018-07-11 14:23 被阅读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;
    }

    相关文章

      网友评论

          本文标题:UICollectionView

          本文链接:https://www.haomeiwen.com/subject/fkqslttx.html