//pragma mark - 数据源
// 返回有多少组"如果不实现此方法默认就是1组"
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 2;
}
// 返回每一组有多少个格子
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 100;
}
// 返回每一组的每一个格子
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
//用dequeueReusableCellWithReuseIdentifier:forIndexPath:此方法来获取cell之前必须要提前注册cell"告诉collectionView它所需要的cell该如果去创建"
// UICollectionView中的cell只能用dequeue的方法来获取或创建
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
return cell;
}
/**
* cell有三种注册方式:
1.xib方式注册cell,并设置重用标识"如果需要创建cell就会自动加载注册时指定的xib文件来创建cell"
2.class方式注册cell,并且设置重用标识"如果需要创建cell就会自动调用注册此指定class的初始化方法来创建cell"
3.storyboard方式注册cell"只需要给storyboard中的cell设置重用标识就可以完成注册,如果需要创建cell会自动的加载storyboard中的cell来创建"
*/
/**
* xib方式注册cell
*/
{
// 设置cell的尺寸
// self.flowLayout.itemSize = CGSizeMake(100, 120);
// 加载xib文件
UINib *nib = [UINib nibWithNibName:@"HMAppCell" bundle:nil];
HMAppCell *cell = [[nib instantiateWithOwner:nil options:nil] lastObject];
self.flowLayout.itemSize = cell.bounds.size;
// 通过xib文件来注册cell"告诉collectionView它所需要的cell该如何去创建"
// 用xib来注册cell时xib文件中的cell最好不要设置重用标识了,可能会出问题
[self.collectionView registerNib:nib forCellWithReuseIdentifier:ID];
}
/**
* class方式注册cell
*/
/**
(报错内容) UICollectionView must be initialized with a non-nil layout parameter
在创建UICollectionView时不能传一个空的布局对象"必须传一个布局对象"
*/
创建布局对象"通过UICollectionViewLayout创建出来的布局对象它里面没有控件cell的大小及间距这些属性,所以它是一个空的布局对象" 所以不能直接用alloc init直接创建
// 创建一个流水布局,它里面有用来控件cell大小及间距的属性
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
// 设置cell的尺寸
flowLayout.itemSize = CGSizeMake(100, 120);
// 1.创建UICollectionView
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:flowLayout];
[self.view addSubview:collectionView];
//设置数据源
collectionView.dataSource = self;
// 通过class来注册cell"告诉collectionView它将来自动创建cell时该如何去创建"
// 将来它要创建cell时会调用此类的initWithFrame:
[collectionView registerClass:[HMAppCell class] forCellWithReuseIdentifier:ID];
"注: 创建时会调用HMAppCell类中的initWithFrame:方法,所以需要重写initWithFrame:初始化方法在此方法中添加所有用来显示数据的子控件;---要记得调用父类的initWithFrame:--- self = [super initWithFrame:frame];
"在该类中重写- (void)layoutSubviews 方法调整子控件的frame;也要记得调用父类方法:[super layoutSubviews];
/**
* collectionView的属性
*/
// 设置collectionView的背景颜色
self.collectionView.backgroundColor = [UIColor whiteColor];
// 获取collectionView中的布局属性
UICollectionViewLayout *layout = self.collectionView.collectionViewLayout;
// 通过此属性可以重新给collectionView设置一个新的布局对象"会覆盖原本自带的流布局"
// self.collectionView.collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
// 设置背景图片,相当于给collectionView添加了一个子控件
self.collectionView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"7"]];
// 选中cell
self.collectionView.allowsSelection = NO;
// 设置是否允许多选
self.collectionView.allowsMultipleSelection = YES;
/************ 以上是UICollectionView的常用属性 ************/
// 通过控制器中去获取布局对象
// 通过控制器的此属性只能获取布局对象,不能更换布局对象
UICollectionViewFlowLayout *layout1 = (UICollectionViewFlowLayout *)self.collectionViewLayout;
layout1.itemSize = CGSizeMake(100, 100);
/******** 以上是UICollectionViewController的属性********/
/***********以下是流布局对象中的属性***((***********/
// 设置cell的尺寸
// self.flowLayout.itemSize = CGSizeMake(100, 100);
// 设置滚动方向
// 当滚动方向发生颠倒后,最小行间距和列间距也会相应的颠倒,头部和尾部的宽或高也会发生相应颠倒
self.flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
// 设置最小行间距
self.flowLayout.minimumLineSpacing = 10;
// 设置最小列间距
self.flowLayout.minimumInteritemSpacing = 20;
// 设置头部视图的尺寸"垂直滚动时,头部的宽是改不了得,如果是水平方向滚动,头部的高是不能改得"
self.flowLayout.headerReferenceSize = CGSizeMake(20, 100);
// 设置尾部视图的尺寸"垂直滚动时,尾部的宽是改不了得,如果是水平方向滚动,尾部的高是不能改得"
self.flowLayout.footerReferenceSize = CGSizeMake(20, 100);
// 设置组的内边距
self.flowLayout.sectionInset = UIEdgeInsetsMake(20, 40, 70, 100);
// 当前组还在可视范围内时头部是否停留
self.flowLayout.sectionHeadersPinToVisibleBounds = YES;
// 当前组还在可视范围内时尾部是否停留
self.flowLayout.sectionFootersPinToVisibleBounds = YES;
// 设置cell的预估尺寸"如果设置了预估尺寸一定要在cell中实现下面方法返回cell真是尺寸:
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
// 此方法要结合预估尺寸属性来使用,如果没有设置预估尺寸,此方法也会调用,只不过,它里面的设置是无效
//实现此方法还必须要调用父类此方法
//预估尺寸
self.flowLayout.estimatedItemSize = CGSizeMake(100, 100);
// 返回每一组的头部或尾部视图
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath {
// 1.定义重用标识
static NSString *ID = @"header";
if (kind == UICollectionElementKindSectionFooter) {
ID = @"footer";
} else {
ID = @"header";
}
//NSLog(@"%@", kind);
// 获取每一组的头部或尾部视图
UICollectionReusableView *reusableView = [collectionView dequeueReusableSupplementaryViewOfKind:kind withReuseIdentifier:ID forIndexPath:indexPath];
return reusableView;
}
// 代理方法
// 取消上一次选中的某个cell
- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath {
//NSLog(@"取消上一次选中的第%zdcell", indexPath.item);
}
// 选中某一个cell
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
// NSLog(@"选中第%zd个cell", indexPath.item);
}
// 流布局中的代理方法
// 返回每一个格子的具体尺寸
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.item % 2 == 0) {
return CGSizeMake(20, 80);
} else {
return CGSizeMake(40, 40);
}
}
"注:
/**
the item width must be less than the width of the UICollectionView minus the section insets left and right values, minus the content insets left and right values.
当collectionView是垂直方向滚动时,cell的宽必须要小于 collectionView的宽 - 组的左边边距 - 组的右边边距
当collectionView是水平方向滚动时,cell的高必须小于 collectionView的高 - 组的顶部边距 - 组的底部边距
// cell尺寸也不能小于或等于 CGSizeZero
*/
UICollectionView的使用
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- UICollectionView的使用方法及demo 直接上代码,说明请看注释吧ViewController.h ...
- 很多项目中用都会有相册功能,实现相册中浏览的图片的功能,你可能会想到使用 scrollview ,但我更建议你通过...
- UICollectionview的基本使用 一些小心得 UICollectionview 其实和UITablevi...
- 1.分析界面由哪些控件组成? 界面有两行,可以用tableView的静态cell来搭建注意:静态cell只能通过s...
- 传送门: UICollectionView官方文档 UICollectionView的简单介绍 因为UIColle...