网上的UICollectionView的Layout布局,其cell的形状多为矩形和圆形。
本篇博文将正六边形作为cell的基本形状,为您展现独特的蜂窝布局效果及实现源代码。
帮助您让自己的App脱颖而出,更加与众不同。
最新完整代码下载地址:
博文首发地址:
实现效果图:
核心源码:
自己定义Layout
//// HoneyCombLayout.h// Demo-Layouts//// Created by 杜子兮(duzixi) on 14-9-1.// Copyright (c) 2014年 lanou3g.com All rights reserved.//#import@interface HoneyCombLayout : UICollectionViewLayout@property (nonatomic, assign) NSInteger margin;@property (nonatomic, assign) NSInteger oX;@property (nonatomic, assign) NSInteger oY;@end
//// HoneyCombLayout.m// Demo-Layouts//// Created by 杜子兮(duzixi) on 14-9-1.// Copyright (c) 2014年 lanou3g.com All rights reserved.//#import "HoneyCombLayout.h"@implementation HoneyCombLayout/// 返回内容大小。用于推断是否须要加快滑动-(CGSize)collectionViewContentSize{ float height = (SIZE + self.margin) * ([self.collectionView numberOfItemsInSection:0] / 4 + 1); return CGSizeMake(320, height);}/// 返回YES,改变布局/*- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{ return YES;}*/#pragma mark - UICollectionViewLayout/// 为每个Item生成布局特性- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{ UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; UICollectionView *collection = self.collectionView; float x = (SIZE + self.margin) * (indexPath.item % COL + 1) * 0.75; float y = (SIZE + self.margin) * (indexPath.item / COL + 0.5) * cos(M_PI * 30.0f / 180.0f); if (indexPath.item % 2 == 1) { y += (SIZE + self.margin) * 0.5 * cosf(M_PI * 30.0f / 180.0f); } x += self.oX; y += self.oY; attributes.center = CGPointMake(x + collection.contentOffset.x, y + collection.contentOffset.y); attributes.size = CGSizeMake(SIZE, SIZE * cos(M_PI * 30.0f / 180.0f)); return attributes;}-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{ NSArray *arr = [super layoutAttributesForElementsInRect:rect]; if ([arr count] > 0) { return arr; } NSMutableArray *attributes = [NSMutableArray array]; for (NSInteger i = 0 ; i < [self.collectionView numberOfItemsInSection:0 ]; i++) { NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0]; [attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]]; } return attributes;}@end自己定义cell:
//// HoneycombViewCell.h// Demo-Layouts//// Created by 杜子兮(duzixi) on 14-9-1.// Copyright (c) 2014年 lanou3g.com All rights reserved.//#import@interface HoneycombViewCell : UICollectionViewCell@property (nonatomic,strong) UILabel *titleLabel;@end
//// HoneycombViewCell.m// Demo-Layouts//// Created by 杜子兮(duzixi) on 14-9-1.// Copyright (c) 2014年 lanou3g.com All rights reserved.//#import "HoneycombViewCell.h"@implementation HoneycombViewCell- (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { // Initialization code self.titleLabel = [[UILabel alloc] init]; self.titleLabel.textColor = [UIColor whiteColor]; [self.contentView addSubview:self.titleLabel]; } return self;}-(void)layoutSubviews{ [super layoutSubviews]; // step 1: 生成六边形路径 CGFloat longSide = SIZE * 0.5 * cosf(M_PI * 30 / 180); CGFloat shortSide = SIZE * 0.5 * sin(M_PI * 30 / 180); UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(0, longSide)]; [path addLineToPoint:CGPointMake(shortSide, 0)]; [path addLineToPoint:CGPointMake(shortSide + SIZE * 0.5, 0)]; [path addLineToPoint:CGPointMake(SIZE, longSide)]; [path addLineToPoint:CGPointMake(shortSide + SIZE * 0.5, longSide * 2)]; [path addLineToPoint:CGPointMake(shortSide, longSide * 2)]; [path closePath]; // step 2: 依据路径生成蒙板 CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.path = [path CGPath]; // step 3: 给cell加入模版 self.layer.mask = maskLayer; self.backgroundColor = [UIColor orangeColor]; self.titleLabel.textAlignment = NSTextAlignmentCenter; self.titleLabel.frame = self.contentView.frame; }/*// Only override drawRect: if you perform custom drawing.// An empty implementation adversely affects performance during animation.- (void)drawRect:(CGRect)rect{ // Drawing code}*/@end