UICollectionView自定义布局(一)

前言

最近看了www.raywenderlich.com的关于UICollectionView自定义布局的的教程,作一下笔记,方便以后查阅。UICollectionView自定义布局的基本概念可以查看喵神的WWDC 2012 Session笔记——219 Advanced Collection Views and Building Custom Layouts这篇文章。

UICollectionView自定义布局(一)

基本原理

下面是轮盘旋转图解,黄色的区域是手机屏幕,蓝色的圆角矩形是UICollectionViewCells,cell以radius为半径,以手机屏幕外的一点为圆心旋转,每个cell之间的夹角为anglePerItem

UICollectionView自定义布局(一)

正如你看到的,不是所有的cell都在屏幕内,假设第0个cell的旋转角度是angle,那么第1个cell的旋转角度就是angle + anglePerItem,以此类推可以得到第i个cell的旋转角度:

CGFloat  angleFori = angle + anglePerItem *i

下面是角度坐标是,0°代表的是屏幕中心,向左为负方向,向右为正方向,所以当cell的角度为0°时是垂直居中的。

UICollectionView自定义布局(一)

自定义布局属性

因为系统的UICollectionViewLayoutAttributes没有angleanchorPoint属性,所以我们继承UICollectionViewLayoutAttributes自定义布局属性。

@implementation WheelCollectionLayoutAttributes
- (instancetype)init{
    self = [super init];
    if (self) {
        self.anchorPoint = CGPointMake(0.5, 0.5);
        self.angle = 0;
    }
    return self;
}

- (id)copyWithZone:(NSZone *)zone{
    WheelCollectionLayoutAttributes *attribute = [super copyWithZone:zone];
    attribute.anchorPoint = self.anchorPoint;
    attribute.angle = self.angle;
    return attribute;
}
@end

初始化时锚点anchorPoint是CGPointMake(0.5, 0.5),angle是0,并且重写- (id)copyWithZone:(NSZone *)zone方法,当对象被拷贝的时候,保证anchorPointangle属性被赋值。

**注意:**对于自定义的布局属性,UICollectionViewCell必须实现下面

相关推荐