UICollectionView自定义布局(一)
前言
最近看了www.raywenderlich.com的关于UICollectionView自定义布局的的教程,作一下笔记,方便以后查阅。UICollectionView自定义布局的基本概念可以查看喵神的WWDC 2012 Session笔记——219 Advanced Collection Views and Building Custom Layouts这篇文章。
基本原理
下面是轮盘旋转图解,黄色的区域是手机屏幕,蓝色的圆角矩形是UICollectionViewCells
,cell以radius
为半径,以手机屏幕外的一点为圆心旋转,每个cell之间的夹角为anglePerItem
。
正如你看到的,不是所有的cell都在屏幕内,假设第0个cell的旋转角度是angle,那么第1个cell的旋转角度就是angle + anglePerItem
,以此类推可以得到第i个cell的旋转角度:
CGFloat angleFori = angle + anglePerItem *i
下面是角度坐标是,0°代表的是屏幕中心,向左为负方向,向右为正方向,所以当cell的角度为0°时是垂直居中的。
自定义布局属性
因为系统的UICollectionViewLayoutAttributes
没有angle
和anchorPoint
属性,所以我们继承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
方法,当对象被拷贝的时候,保证anchorPoint
和angle
属性被赋值。
**注意:**对于自定义的布局属性,UICollectionViewCell
必须实现下面