UICollectionView是一種類(lèi)似于表格一樣的視圖统诺,它有4個(gè)主要部分:
1件豌、單元格:它是UICollectionView中的一個(gè)個(gè)單元格
2、節(jié):它是UICollectionView中的一行數(shù)據(jù),可以由一個(gè)或者多個(gè)單元格組成
3、補(bǔ)充視圖:它是節(jié)的頭部視圖和尾部視圖
4淋肾、裝飾視圖:UICollectionView的背景視圖
UICollectionView繼承于UIScrollView(滾動(dòng)視圖)。它也有兩個(gè)協(xié)議——UICollectionViewDelegate和UICollectionViewDatasource爸邢。UICollectionViewCell是它的單元格類(lèi)樊卓,它的布局是由UICollectionViewLayout類(lèi)定義的,它是一個(gè)抽象類(lèi)杠河。UICollectionViewFlowLayout類(lèi)是UICollectionViewLayout的子類(lèi)碌尔。對(duì)于復(fù)雜的布局,可以自定義UICollectionViewLayout類(lèi)券敌。UICollectionView對(duì)應(yīng)的控制器是UICollectionViewController類(lèi)唾戚。
下面這個(gè)Demo實(shí)現(xiàn)了一個(gè)4行2列的UICollectionView,點(diǎn)擊其中一個(gè)打印一條信息陪白。
界面如下:
因?yàn)樽宇?lèi)化颈走,所以將單元格視圖單獨(dú)建立了一個(gè)類(lèi)
ViewController.m代碼如下:
#import "ViewController.h"
#import "CollectionViewCell.h"
@interface ViewController ()<UICollectionViewDelegate,UICollectionViewDataSource>
{
NSArray *_events; //定義接收?qǐng)D片數(shù)組
int columnNumber; //定義一行幾個(gè)單元格
}
@property (weak, nonatomic) IBOutlet UICollectionView *collectionView;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"events.plist" ofType:nil];
_events = [[NSArray alloc]initWithContentsOfFile:filePath];
columnNumber = 2;
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
}
#pragma mark - UICollectionView數(shù)據(jù)源協(xié)議方法
//可選實(shí)現(xiàn)
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
//返回行數(shù)
int num = _events.count % columnNumber;
if (num == 0) {//表明除盡
return _events.count / columnNumber;
} else {//表明未除盡,返回的時(shí)候要多一行
return _events.count / columnNumber + 1;
}
}
//必須實(shí)現(xiàn)
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
//返回某行中的單元格數(shù)量
return columnNumber;
}
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
//為單元格提供數(shù)據(jù)
CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellID" forIndexPath:indexPath];
NSDictionary *event = _events[indexPath.section * columnNumber +indexPath.row];
cell.label.text = [event objectForKey:@"name"];
cell.imageView.image = [UIImage imageNamed:event[@"image"]];
return cell;
}
#pragma mark - UICollectionView代理協(xié)議方法
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *event = _events[indexPath.section * columnNumber +indexPath.row];
NSLog(@"選中了:%@",event[@"name"]);
}
@end
CollectionViewCell.h代碼如下:
#import <UIKit/UIKit.h>
@interface CollectionViewCell : UICollectionViewCell
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UILabel *label;
@end
為了進(jìn)一步體現(xiàn)子類(lèi)化也可以將給單元格賦值數(shù)據(jù)的代碼轉(zhuǎn)移到CollectionViewCell.m的代碼中去實(shí)現(xiàn)咱士。實(shí)現(xiàn)過(guò)程:在CollectionViewCell.h文件中聲明一個(gè)字典對(duì)象用于在ViewController中去接收數(shù)據(jù)然后在CollectionViewCell.m中通過(guò)重構(gòu)initWithFrame方法來(lái)將數(shù)據(jù)展現(xiàn)出來(lái)立由,由于這里面的視圖和數(shù)據(jù)比較簡(jiǎn)單,所以放在ViewController中展現(xiàn)了數(shù)據(jù)序厉。