UICollectionView 简单使用
2017-09-16 本文已影响8人
忆白i
#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