-
UICollectionView使用注意点
-
创建UICollectionView必须要有布局参数
-
cell必须通过注册
-
cell必须自定义,系统cell没有任何子控件
-
示例
#import "ViewController.h"
#import "PhotoCell.h"
@interface ViewController ()<UICollectionViewDataSource>
@end
static NSString * const ID = @"cell";
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//函数式编程思想(高聚合):把很多功能放在一个函数块(block块)去处理 多见于swift
UICollectionViewFlowLayout *layout = ({
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
//设置水平滚动
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
//设置cell的尺寸
layout.itemSize = CGSizeMake(160, 160);
CGFloat margin = ([UIScreen mainScreen].bounds.size.width - 160) *0.5;
//设置内边距
layout.sectionInset = UIEdgeInsetsMake(0, margin, 0, margin);
//设置最小行间距
layout.minimumLineSpacing = 50;
layout;
});
UICollectionView *collectionView = ({
UICollectionView *collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:layout];
collectionView.backgroundColor = [UIColor blueColor];
collectionView.center = self.view.center;
collectionView.bounds =CGRectMake(0, 0, self.view.bounds.size.width, 200);
[self.view addSubview:collectionView];
collectionView;
});
//关闭水平滚动条
collectionView.showsHorizontalScrollIndicator = NO;
collectionView.dataSource = self;
//注册nib
[collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([PhotoCell class]) bundle:nil] forCellWithReuseIdentifier:ID];
}
//有多少个cell
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 10;
}
//cell样式
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
PhotoCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
NSString *imageName = [NSString stringWithFormat:@"%ld",indexPath.item + 1];
cell.image = [UIImage imageNamed:imageName];
return cell;
}
@end
-
UICollectionViewFlowLayout自定义布局
-
UICollectionViewFlowLayout自定义布局必须知道的5个方法
// 何时调用:collectionView第一次布局,collectionView刷新的时候也会调用
// 作用:计算cell的布局,条件:cell的位置是固定不变
- (void)prepareLayout
{
[super prepareLayout];
}
// 作用:指定一段区域给你这段区域内cell的尺寸
// 可以一次性返回所有cell尺寸,也可以每隔一个距离返回cell
/**
UICollectionViewLayoutAttributes:确定cell的尺寸
一个UICollectionViewLayoutAttributes对象就对应一个cell
拿到UICollectionViewLayoutAttributes相当于拿到cell
*/
- (nullable NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray *attrs = [super layoutAttributesForElementsInRect:CGRectMake(0, 0, MAXFLOAT, MAXFLOAT)];
return attrs;
}
// 何时:用户手指一松开就会调用
// 作用:确定最终偏移量
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{
// 拖动比较快 最终偏移量 不等于 手指离开时偏移量
// 最终偏移量
CGPoint targetP = [super targetContentOffsetForProposedContentOffset:proposedContentOffset withScrollingVelocity:velocity];
// 获取collectionView偏移量
NSLog(@"%@ %@",NSStringFromCGPoint(targetP),NSStringFromCGPoint(self.collectionView.contentOffset));
return CGPointZero;
}
// Invalidate:刷新
// 在滚动的时候是否允许刷新布局
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
return YES;
}
// 计算collectionView滚动范围
- (CGSize)collectionViewContentSize{
return [super collectionViewContentSize];
}
demo