UICollectionView
2018-07-11 本文已影响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;
}