iOS6.0之后,提供了UICollectionView。与UITableView相似,但是也有很多不同。
1、首先需要引入除了UICollectionViewDelegate,UICollectionViewDataSource之外的UICollectionViewDelegateFlowLayout。
2、在创建实例的时候,要注意
UICollectionView *collectionView = [UICollectionView new];
这样生成会崩溃。必须是
//注意 UICollectionViewFlowLayout 不是UICollectionViewLayout。UICollectionViewFlowLayout是UICollectionViewLayout的子类。
UICollectionViewFlowLayout *collectionLayout = [UICollectionViewFlowLayout new];
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout: collectionLayout];
UICollectionViewFlowLayout用来控制布局的。有一些常用的属性:
@property (nonatomic) CGFloat minimumLineSpacing;//每行的距离
@property (nonatomic) CGFloat minimumInteritemSpacing;//每个cell的距离
@property (nonatomic) CGSize itemSize;//每个cell的大小,如果每个cell的大小不一样,就不要设置这个属性。
@property (nonatomic) UIEdgeInsets sectionInset;//每个section的相对距离
@property (nonatomic) UICollectionViewScrollDirection scrollDirection;//视图滑动的方向
在创建完UICollectionView实例后,才能设置上面的属性。否则是无效的。
3、UICollectionView 也有UITableView一样的方法
- ( UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
在实现的时候,却是不同的。UICollectionViewCell不需要判断是否为空。在视图初始化的时候,必须注册Cell,系统生成在缓冲区中自动获取。
错误:
UICollectionViewCell *collectionCell = [UICollectionViewCell new];
if (! collectionCell)
{
collectionCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionCell"];
}
正确:
UICollectionViewCell *collectionCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"collectionCell"];
4、很多时候是需要自定义UICollectionViewCell。在重写创建方法的时候
-(id)init;//重写这个方法是无效的。不会调用重写的方法。
//应该使用-(id)initWithFrame:(CGRect)frame;
-(id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if(self)
{
//需要调用的方法。
}
return self;
}
自定义UICollectionViewFlowLayout一个新类,可以实现很多酷炫的动画。例如:引导页、轮播图、瀑布流视图...