UICollectionView使用总结和Cell的事件响应处理
2016-07-06 本文已影响8176人
阿龍飛
纯代码篇
#import "ViewController.h"
#define _CELL @ "acell"
@interface ViewController ()< UICollectionViewDataSource , UICollectionViewDelegate , UICollectionViewDelegateFlowLayout >
@property (nonatomic , strong) UICollectionView * collectionView;
@property (nonatomic , strong) NSMutableArray *arr;
@property (nonatomic , assign) CGFloat Height;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self arr];
[self collectionView];
}
#pragma mark - lazyload
-(UICollectionView *)collectionView{
if (_collectionView == nil) {
NSInteger i = _arr.count-1;
_Height = 20+(i/4+1)*20+(i/4)*10;
//先实例化一个层
UICollectionViewFlowLayout *layout=[[ UICollectionViewFlowLayout alloc ] init ];
[layout setScrollDirection:UICollectionViewScrollDirectionVertical];
//创建UICollectionView大小
_collectionView=[[ UICollectionView alloc ] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, _Height) collectionViewLayout :layout];
//注册Cell类
[_collectionView registerClass :[ UICollectionViewCell class ] forCellWithReuseIdentifier : _CELL ];
_collectionView. delegate = self ;
_collectionView. dataSource = self ;
_collectionView.backgroundColor = [UIColor grayColor];
[ self . view addSubview :_collectionView];
}
return _collectionView;
}
-(NSMutableArray *)arr{
if (_arr==nil) {
_arr = [[NSMutableArray alloc]initWithObjects:@"父母之魂1",@"父母之魂2",@"父母之魂3",@"父母之魂4",@"父母之魂5",@"父母之魂6",@"父母之魂7",@"父母之魂8",@"父母之魂1",@"父母之魂2",@"父母之魂3",@"父母之魂4",@"父母之魂5",@"父母之魂6",@"父母之魂7",@"父母之魂8",nil];
}
return _arr;
}
#pragma mark --UICollectionViewDataSource
//定义展示的UICollectionViewCell的个数
-( NSInteger )collectionView:( UICollectionView *)collectionView numberOfItemsInSection:( NSInteger )section{
return _arr.count ;
}
//定义展示的Section的个数
-( NSInteger )numberOfSectionsInCollectionView:( UICollectionView *)collectionView{
return 1 ;
}
//每个UICollectionView展示的内容
-( UICollectionViewCell *)collectionView:( UICollectionView *)collectionView cellForItemAtIndexPath:( NSIndexPath *)indexPath{
UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier : _CELL forIndexPath :indexPath];
UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 70, 20)];
[btn setTitleColor:[UIColor blackColor] forState:(UIControlStateNormal)];
btn.backgroundColor = [UIColor yellowColor];
[btn setTitle:[_arr objectAtIndex:indexPath.row] forState:(UIControlStateNormal)];
[cell.contentView addSubview:btn];
btn.userInteractionEnabled = NO;
return cell;
}
#pragma mark --UICollectionViewDelegate
//UICollectionView被选中时调用的方法
-( void )collectionView:( UICollectionView *)collectionView didSelectItemAtIndexPath:( NSIndexPath *)indexPath{
NSLog(@"%ld",(long)indexPath.row);
[_arr removeObjectAtIndex:indexPath.row];
[collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:indexPath]];
//删除后再计算collection的高度
NSInteger i = _arr.count-1;
_Height = 20+(i/4+1)*20+(i/4)*10;
_collectionView.frame = CGRectMake(0, 64, self.view.frame.size.width, _Height);
}
//返回这个UICollectionViewCell是否可以被选择
-( BOOL )collectionView:( UICollectionView *)collectionView shouldSelectItemAtIndexPath:( NSIndexPath *)indexPath{
return YES ;
}
#pragma mark --UICollectionViewDelegateFlowLayout
//定义每个UICollectionView 的大小
- ( CGSize )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:( NSIndexPath *)indexPath{
return CGSizeMake ( 70 , 20 );
}
//定义每个UICollectionView 的边距(次序: 上,左,下,右边)
-( UIEdgeInsets )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:( NSInteger )section{
return UIEdgeInsetsMake ( 10 , 10 , 10 , 10 );
}
//设置单元格间的横向间距
- (CGFloat) collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
return (self.view.frame.size.width-10-280)/4;
}
//设置单元格间的竖向间距
- (CGFloat) collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
return 10;
}
// 长按某item,弹出copy和paste的菜单
- (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
// 使copy和paste有效
- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender
{
if ([NSStringFromSelector(action) isEqualToString:@"copy:"] || [NSStringFromSelector(action) isEqualToString:@"paste:"])
{
return YES;
}
return NO;
}
- (void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender
{
if([NSStringFromSelector(action) isEqualToString:@"copy:"])
{
NSLog(@"-------------执行拷贝-------------");
//点击长按弹出copy和paste--点击copy删除cell
__weak typeof(self)weakSelf = self;
[_collectionView performBatchUpdates:^{
[weakSelf.arr removeObjectAtIndex:indexPath.row];
[weakSelf.collectionView deleteItemsAtIndexPaths:@[indexPath]];
//删除后再计算collection的高度
NSInteger i = weakSelf.arr.count-1;
weakSelf.Height = 20+(i/4+1)*20+(i/4)*10;
weakSelf.collectionView.frame = CGRectMake(0, 64, self.view.frame.size.width, weakSelf.Height);
} completion:nil];
}
else if([NSStringFromSelector(action) isEqualToString:@"paste:"])
{
NSLog(@"-------------执行粘贴-------------");
//点击长按弹出copy和paste--点击paste添加一个cell
__weak typeof(self)weakSelf = self;
[_collectionView performBatchUpdates:^{
// 构造一个indexPath
NSIndexPath *indePath = [NSIndexPath indexPathForItem:weakSelf.arr.count inSection:0];
[weakSelf.collectionView insertItemsAtIndexPaths:@[indePath]]; // 然后在此indexPath处插入给collectionView插入一个item
[weakSelf.arr addObject:@"x"]; // 保持collectionView的item和数据源一致
//增加后再计算collection的高度
NSInteger i = weakSelf.arr.count-1;
weakSelf.Height = 20+(i/4+1)*20+(i/4)*10;
weakSelf.collectionView.frame = CGRectMake(0, 64, self.view.frame.size.width, weakSelf.Height);
} completion:nil];
}
}
@end
效果图如下
2389367-100a44c8ea2664b5-2.jpg
//
// AwardRecordViewController.m
// CaiCai
//
// Created by apple on 2017/6/3.
// Copyright © 2017年 apple. All rights reserved.
//
#import "AwardRecordViewController.h"
#import "HomeGameCollectionCell.h"
#import "HomeCompetitionCollectionCell.h"
#import "ADCollectionCell.h"
#import "HomeCollectionCellHeader.h"
@interface AwardRecordViewController ()<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,ADCollectionCellDelegate>
@property (nonatomic, strong) UICollectionView * collectionView;
@property (nonatomic, strong) UILabel * numberLab;
@end
@implementation AwardRecordViewController
#pragma mark - Life Cycle
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"我的收藏";
[self collectionView];
}
#pragma mark - lazyload
-(UICollectionView *)collectionView{
if (!_collectionView) {
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
_collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT-64) collectionViewLayout:layout];
[self.view addSubview:_collectionView];
[self.collectionView registerNib:[UINib nibWithNibName:@"HomeGameCollectionCell" bundle:nil] forCellWithReuseIdentifier:@"HomeGameCollectionCell"];
[self.collectionView registerNib:[UINib nibWithNibName:@"ADCollectionCell" bundle:nil] forCellWithReuseIdentifier:@"ADCollectionCell"];
[self.collectionView registerNib:[UINib nibWithNibName:@"HomeCompetitionCollectionCell" bundle:nil] forCellWithReuseIdentifier:@"HomeCompetitionCollectionCell"];
[self.collectionView registerNib:[UINib nibWithNibName:@"HomeCollectionCellHeader" bundle:nil]
forSupplementaryViewOfKind:UICollectionElementKindSectionHeader
withReuseIdentifier:@"HomeCollectionCellHeader"];
_collectionView.backgroundColor = [UIColor whiteColor];
_collectionView.delegate = self;
_collectionView.dataSource = self;
}
return _collectionView;
}
#pragma mark UICollectionViewDataSource
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 3;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
if (section == 0) {
return 1;
}else if (section == 1){
return 9;
}
return 9;
}
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{
if([kind isEqualToString:UICollectionElementKindSectionHeader])
{
if (indexPath.section == 1) {
HomeCollectionCellHeader *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
withReuseIdentifier:@"HomeCollectionCellHeader"
forIndexPath:indexPath];
view.titleLab.text = @"官方比赛";
return view;
}
else if(indexPath.section == 2){
HomeCollectionCellHeader * view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader
withReuseIdentifier:@"HomeCollectionCellHeader"
forIndexPath:indexPath];
view.titleLab.text = @"我的竞猜";
return view;
}
}
return nil;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
HomeGameCollectionCell *gameCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeGameCollectionCell" forIndexPath:indexPath];
HomeCompetitionCollectionCell *competitionCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"HomeCompetitionCollectionCell" forIndexPath:indexPath];
ADCollectionCell *adCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ADCollectionCell" forIndexPath:indexPath];
adCell.delegate = self;
if (indexPath.section == 0) {
return adCell;
}else if(indexPath.section == 1){
return gameCell;
}else if (indexPath.section == 2){
return competitionCell;
}
return nil;
}
#pragma mark --UICollectionViewDelegate
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%ld",(long)indexPath.row);
}
-( BOOL )collectionView:( UICollectionView *)collectionView shouldSelectItemAtIndexPath:( NSIndexPath *)indexPath{
return YES ;
}
#pragma mark --UICollectionViewDelegateFlowLayout
- ( CGSize )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:( NSIndexPath *)indexPath{
if (indexPath.section == 0) {
return CGSizeMake ( WIDTH , 190*Y_SCALE_RATE_PLUS );
}else if (indexPath.section){
return CGSizeMake ( WIDTH/2 , 200*Y_SCALE_RATE_PLUS );
}
return CGSizeMake ( WIDTH/2 , 156 );
}
-( UIEdgeInsets )collectionView:( UICollectionView *)collectionView layout:( UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:( NSInteger )section{
return UIEdgeInsetsMake ( 0 , 0 , 0 , 0 );
}
- (CGFloat) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{
return 0;
}
- (CGFloat) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
return 0;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
if (section == 0) {
return CGSizeZero;
}
return (CGSize){WIDTH,50*Y_SCALE_RATE_PLUS};
}
#pragma mark -AdTableViewCellDelegate
-(void)AdTableViewCellDidClick:(NSArray *)imageUrls index:(NSUInteger)index{
NSLog(@"%lu",(unsigned long)index);
NSLog(@"%@",imageUrls);
}
#pragma mark -private
#pragma mark - Data Request
@end