IrregularGridCollectionView處理不定寬度的標簽cell

效果

源碼
https://github.com/YouXianMing/UI-Component-Collection 中的IrregularGridCollectionView
//
// IrregularGridCollectionView.h
// IrregularGridCollectionView
//
// Created by YouXianMing on 16/8/30.
// Copyright © 2016年 YouXianMing. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "IrregularGridCellDataAdapter.h"
#import "MaximumSpacingFlowLayout.h"
#import "CustomIrregularGridViewCell.h"
@class IrregularGridViewCellClassType;
@class IrregularGridCollectionView;
@protocol IrregularGridCollectionViewDelegate <NSObject>
@optional
/**
* IrregularGridCollectionView did selected event.
*
* @param collectionGridView CollectionGridView's object.
* @param cell CustomCollectionGridViewCell type's cell.
* @param event CustomCollectionGridViewCell's event.
*/
- (void)irregularGridCollectionView:(IrregularGridCollectionView *)irregularGridCollectionView didSelectedCell:(CustomIrregularGridViewCell *)cell event:(id)event;
@end
@interface IrregularGridCollectionView : UIView
/**
* CollectionGridView's delegate.
*/
@property (nonatomic, weak) id <IrregularGridCollectionViewDelegate> delegate;
/**
* CollectionView.
*/
@property (nonatomic, strong, readonly) UICollectionView *collectionView;
/**
* Content edgeInsets, default is UIEdgeInsetsMake(5, 5, 5, 5).
*/
@property (nonatomic) UIEdgeInsets contentEdgeInsets;
/**
* Horizontal item's gap, default is 5.f.
*/
@property (nonatomic) CGFloat horizontalGap;
/**
* Vertical item's gap, default is 5.f.
*/
@property (nonatomic) CGFloat verticalGap;
/**
* Item's height, default is 20.f.
*/
@property (nonatomic) CGFloat gridHeight;
/**
* Register the cells.
*/
@property (nonatomic, strong) NSArray <IrregularGridViewCellClassType *> *registerCells;
/**
* The cells data adapter.
*/
@property (nonatomic, strong) NSMutableArray <IrregularGridCellDataAdapter *> *adapters;
/**
* To make the config effective.
*/
- (void)makeTheConfigEffective;
/**
* Get the CollectionView's content size.
*/
@property (nonatomic, readonly) CGSize contentSize;
/**
* Reset the view's size.
*/
- (void)resetSize;
#pragma mark - Constructor.
+ (instancetype)irregularGridCollectionViewWithFrame:(CGRect)frame
delegate:(id <IrregularGridCollectionViewDelegate>)delegate
registerCells:(NSArray <IrregularGridViewCellClassType *> *)registerCells
contentEdgeInsets:(UIEdgeInsets)edgeInsets
verticalGap:(CGFloat)verticalGap
horizontalGap:(CGFloat)horizontalGap
gridHeight:(CGFloat)gridHeight;
@end
#pragma mark - CollectionGridViewCellClassType Class
@interface IrregularGridViewCellClassType : NSObject
@property (nonatomic) Class className;
@property (nonatomic, strong) NSString *reuseIdentifier;
@end
NS_INLINE IrregularGridViewCellClassType *gridViewCellClassType(Class className, NSString *reuseIdentifier) {
IrregularGridViewCellClassType *type = [IrregularGridViewCellClassType new];
type.className = className;
type.reuseIdentifier = reuseIdentifier;
return type;
}
//
// IrregularGridCollectionView.m
// IrregularGridCollectionView
//
// Created by YouXianMing on 16/8/30.
// Copyright © 2016年 YouXianMing. All rights reserved.
//
#import "IrregularGridCollectionView.h"
#pragma mark - IrregularGridCollectionView Class
@interface IrregularGridCollectionView () <UICollectionViewDelegate, UICollectionViewDataSource, CustomIrregularGridViewCellDelegate>
@property (nonatomic, strong) UICollectionView *collectionView;
@property (nonatomic, strong) UICollectionViewFlowLayout *flowLayout;
@end
@implementation IrregularGridCollectionView
#pragma mark - Init
- (void)layoutSubviews {
[super layoutSubviews];
_collectionView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self.contentEdgeInsets = UIEdgeInsetsMake(5, 5, 5, 5);
self.horizontalGap = 5.f;
self.verticalGap = 5.f;
self.gridHeight = 20.f;
// Init UICollectionViewFlowLayout.
self.flowLayout = [[MaximumSpacingFlowLayout alloc] init];
// Init UICollectionView.
self.collectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:self.flowLayout];
self.collectionView.showsHorizontalScrollIndicator = NO;
self.collectionView.showsVerticalScrollIndicator = NO;
self.collectionView.backgroundColor = [UIColor clearColor];
self.collectionView.delegate = self;
self.collectionView.dataSource = self;
[self addSubview:self.collectionView];
}
return self;
}
- (void)makeTheConfigEffective {
self.collectionView.contentInset = self.contentEdgeInsets;
self.flowLayout.minimumLineSpacing = self.verticalGap;
self.flowLayout.minimumInteritemSpacing = self.horizontalGap;
}
#pragma mark - UICollectionView's delegate & data source.
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return _adapters.count;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
IrregularGridCellDataAdapter *adapter = _adapters[indexPath.row];
adapter.indexPath = indexPath;
CustomIrregularGridViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:adapter.cellReuseIdentifier forIndexPath:indexPath];
cell.delegate = self;
cell.dataAdapter = adapter;
cell.data = adapter.data;
cell.indexPath = indexPath;
cell.collectionView = collectionView;
cell.collectionGridView = self;
[cell loadContent];
return cell;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
IrregularGridCellDataAdapter *adapter = _adapters[indexPath.row];
return CGSizeMake(adapter.itemWidth, self.gridHeight);
}
+ (instancetype)irregularGridCollectionViewWithFrame:(CGRect)frame
delegate:(id <IrregularGridCollectionViewDelegate>)delegate
registerCells:(NSArray <IrregularGridViewCellClassType *> *)registerCells
contentEdgeInsets:(UIEdgeInsets)edgeInsets
verticalGap:(CGFloat)verticalGap
horizontalGap:(CGFloat)horizontalGap
gridHeight:(CGFloat)gridHeight {
IrregularGridCollectionView *irregularGridView = [[[self class] alloc] initWithFrame:frame];
irregularGridView.delegate = delegate;
irregularGridView.contentEdgeInsets = edgeInsets;
irregularGridView.verticalGap = verticalGap;
irregularGridView.horizontalGap = horizontalGap;
irregularGridView.gridHeight = gridHeight;
irregularGridView.registerCells = registerCells;
[irregularGridView makeTheConfigEffective];
return irregularGridView;
}
#pragma mark - CustomIrregularGridViewCellDelegate
- (void)customIrregularGridViewCell:(CustomIrregularGridViewCell *)cell event:(id)event {
if (self.delegate && [self.delegate respondsToSelector:@selector(irregularGridCollectionView:didSelectedCell:event:)]) {
[self.delegate irregularGridCollectionView:self didSelectedCell:cell event:event];
}
}
#pragma mark - Setter & Getter
- (void)setRegisterCells:(NSArray <IrregularGridViewCellClassType *> *)registerCells {
_registerCells = registerCells;
for (IrregularGridViewCellClassType *type in registerCells) {
[self.collectionView registerClass:type.className forCellWithReuseIdentifier:type.reuseIdentifier];
}
}
- (CGSize)contentSize {
CGSize size = [_flowLayout collectionViewContentSize];
size.width += self.contentEdgeInsets.left + self.contentEdgeInsets.right;
size.height += self.contentEdgeInsets.top + self.contentEdgeInsets.bottom;
return size;
}
- (void)resetSize {
CGRect newFrame = self.frame;
newFrame.size = [self contentSize];
self.frame = newFrame;
}
@end
#pragma mark - IrregularGridViewCellClassType Class
@implementation IrregularGridViewCellClassType
@end
細節
