iOS-UICollectionView

  • UICollectionView使用注意点

  • 创建UICollectionView必须要有布局参数

  • cell必须通过注册

  • cell必须自定义,系统cell没有任何子控件

  • 示例

#import "ViewController.h"
#import "PhotoCell.h"
@interface ViewController ()

@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

你可能感兴趣的:(iOS-UICollectionView)