網上的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
// // 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