Storyboardを使わずにUICollectionViewを使う

registerClass:forCellWithReuseIdentifier:を使います。

ヘッダーやフッターを使うなら
registerClass:forSupplementaryViewOfKind:withReuseIdentifier:を使います。その時は flowLayout.headerReferenceSizeに値をセットしないと、collectionView:viewForSupplementaryElementOfKind:atIndexPath:が呼ばれません。


```objc:CollectinViewController.h
#import <UIKit/UIKit.h>

@interface CustomCollectionSectionView : UICollectionReusableView
@property (nonatomic, readonly) UILabel *titleLabel;
@end



@interface CollectionViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource>

@property (retain, nonatomic) UICollectionViewFlowLayout *flowLayout;
@property (retain, nonatomic) UICollectionView *collectionView;

@end
```

```objc:CollectionViewController.m
#import "CollectionViewController.h"

@implementation CustomCollectionSectionView
-(id)initWithFrame:(CGRect)frame {
	self = [super initWithFrame:frame];
	if (self) {
		self.backgroundColor = [UIColor whiteColor];
		CGRect rect = frame;
		rect.origin.x = 8;
		rect.origin.y = 0;
		_titleLabel = [[UILabel alloc] initWithFrame:rect];
		[self addSubview:_titleLabel];
	}
	return self;
}
@end


@interface CollectionViewController ()

@end

@implementation CollectionViewController
static NSString * const cellID = @"cell";
static NSString * const headerID = @"header";

- (void)viewDidLoad {
	[super viewDidLoad];
	self.flowLayout = [[UICollectionViewFlowLayout alloc]init];
	self.flowLayout.itemSize = CGSizeMake(100, 100);
	self.flowLayout.sectionInset = UIEdgeInsetsMake(16, 16, 32, 16);
	self.flowLayout.headerReferenceSize = CGSizeMake(100, 30);
//	self.flowLayout.minimumLineSpacing = 16;
//	self.flowLayout.minimumInteritemSpacing = 16;
	
	self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) collectionViewLayout:self.flowLayout];
	[self.view addSubview:self.collectionView];
	self.collectionView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
	[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellID];
	[self.collectionView registerClass:[CustomCollectionSectionView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerID];
	self.collectionView.delegate = self;
	self.collectionView.dataSource = self;
}


- (void)didReceiveMemoryWarning {
	[super didReceiveMemoryWarning];
}


#pragma mark - UICollectionViewDelegate
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
	return 3;
}


-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
	
	if (kind == UICollectionElementKindSectionHeader) {
		CustomCollectionSectionView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:headerID forIndexPath:indexPath];
		NSArray *titles = @[@"Red",@"Blue",@"Yellow"];
		headerView.titleLabel.text = titles[ indexPath.section ];
		return headerView;
	} else {
		return nil;
	}
}


-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
	int nums[] = {8,5,10};
	return nums[section];
}


#pragma mark - UICollectionViewDataSource
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
	
	UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
	NSArray *colors = @[[UIColor redColor], [UIColor blueColor], [UIColor yellowColor]];
	cell.backgroundColor = colors[ indexPath.section ];
	return cell;
}


-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
	NSLog(@"section = %d, row = %d", indexPath.section, indexPath.row);
}
@end
```