UI控件---CollectionView

1.创建一个UIView --- 创建UICollectionView放在view上 --- 在这之前先初始化UICollectionViewFlowLayout实例对象

#import <UIKit/UIKit.h>

@interface BCView : UIView
@property(nonatomic,strong)UICollectionView *collectionView;
@property(nonatomic,strong)UICollectionViewFlowLayout *layout;
@end

#import "BCView.h"
@implementation BCView
-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self creatCollectionView];
    }
    return self;
}
#pragma mark 创建collectionView
- (void)creatCollectionView
{
//    @property (nonatomic) CGSize headerReferenceSize;
//    @property (nonatomic) CGSize footerReferenceSize;
    // 创建flowLayout
    self.layout = [[UICollectionViewFlowLayout alloc] init];
    // 设置属性布局
    self.layout.footerReferenceSize = CGSizeMake(0, 40);
    self.layout.headerReferenceSize = CGSizeMake(0, 40);
    // 设置cell的大小
    self.layout.itemSize = CGSizeMake(100, 115);
    // 设置cell之间的间隔
    // 上下行之间的距离
    self.layout.minimumLineSpacing = 10;
    // 左右列之间的距离
    self.layout.minimumInteritemSpacing = 10;
    // 设置滑动方向
    // layOut.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    // 设置item的两边距离
    self.layout.sectionInset = UIEdgeInsetsMake(30, 18, 30, 18);
    // 创建UICollectionView的时候必须指定布局(UICollectionViewFlowLayout)
    self.collectionView = [[UICollectionView alloc] initWithFrame:[UIScreen mainScreen].bounds collectionViewLayout:self.layout];
    // 默认背景色---黑色
    self.collectionView.backgroundColor = [UIColor groupTableViewBackgroundColor];
    [self addSubview:self.collectionView];
}
@end

 2.UIViewController

   》Json数据转模型数据

   》根据模型数据来设置UICollectionViewCell

    类似于UITableView先给collectionView注册UICollectionViewCell

    // 注册 --- 给CollectionView注册cell
    // [self.rootView.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"UICollectionViewCel"];
    [self.rootView.collectionView registerClass:[BCMyCollectionViewCell class] forCellWithReuseIdentifier:@"BCMyCollectionViewCell"];

  》这里自定义cell

#import <UIKit/UIKit.h>
@interface BCMyCollectionViewCell : UICollectionViewCell
@property(nonatomic,strong)UIImageView *headerImageView;
@property(nonatomic,strong)UILabel *textLabel;
#pragma mark 创建view
- (void)creatAllViews;
- (void)updateFram;
@end


#import "BCMyCollectionViewCell.h"
@implementation BCMyCollectionViewCell
-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) { 
      //[self creatAllViews];
    }
    return self;
}

#pragma mark 创建view
- (void)creatAllViews
{
    [self.headerImageView removeFromSuperview];
    self.headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, (self.frame.size.height/5)*4)];
    [self.contentView addSubview:self.headerImageView];
    [self.textLabel removeFromSuperview];
    self.textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, (self.frame.size.height/5)*4, self.frame.size.width, self.frame.size.height/5)];
    // 居中
    self.textLabel.textAlignment = NSTextAlignmentCenter;
    [self.contentView addSubview:self.textLabel];
}

- (void)updateFram
{
    self.headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, (self.frame.size.height/5)*4)];
    self.textLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, (self.frame.size.height/5)*4, self.frame.size.width, self.frame.size.height/5)];
}

 》代理方法设置分组的个数,每个分组的item数量,cell显示的内容--- UICollectionViewDataSource,UICollectionViewDelegate

#pragma mark 代理方法
// 分组的个数
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 5;
}
// 设置item个数
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{

   return self.dataArray.count;
}
// 设置展示的内容(设置cell)
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cell_id = @"BCMyCollectionViewCell";
    // 去重用队列里面寻找cell
    BCMyCollectionViewCell *myCell = [collectionView dequeueReusableCellWithReuseIdentifier:cell_id forIndexPath:indexPath];
    myCell.backgroundColor = [UIColor whiteColor];
    //[myCell updateFram];
    [myCell creatAllViews];
    // NSLog(@"%@",cell.contentView);
    BCModel *model = self.dataArray[indexPath.row];
    //self.rootView.layout
    [myCell.headerImageView sd_setImageWithURL:[NSURL URLWithString:model.thumbURL]];
    myCell.textLabel.text = [NSString stringWithFormat:@"第%ld张",indexPath.row+1];

    return myCell;
    
}

 》设置每个分组的头部和尾部 --- 先注册

// 注册头部和尾部
    // 注册头部 --- UICollectionElementKindSectionHeader
     [self.rootView.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];
    // 注册尾部
     [self.rootView.collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"footer"];
#pragma mark 代理方法 --- 设置 collectionView的头部和尾部
// collectionView的头部和尾部也需要重用 --- 先注册
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
    // 头部
    if (kind == UICollectionElementKindSectionHeader) {
        // 重用队列里面去找头部
        UICollectionReusableView *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"header" forIndexPath:indexPath];
        // 直接添加按钮
        UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 2, 100, 60)];
        [button setTitle:@"哈哈哈" forState:UIControlStateNormal];
        [reusableView addSubview:button];
        
        reusableView.backgroundColor = [UIColor lightGrayColor];
        return reusableView;
    }
        // 重用队列去寻找尾部
        UICollectionReusableView *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:@"footer" forIndexPath:indexPath];
        reusableView.backgroundColor = [UIColor redColor];
        return reusableView;
}

 》设置cell的尺寸(大小)--- 优先级最高

#pragma mark 设置cell的大小 --- 设置每个cell的大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{

    BCModel *model = self.dataArray[indexPath.row];
    self.rootView.layout.itemSize = CGSizeMake([model.width floatValue]/4, [model.height floatValue]/4);
    return self.rootView.layout.itemSize;
    
}
原文地址:https://www.cnblogs.com/bachl/p/4692426.html