由于没有用过collectionview,也是刚开始纯代码布局,所以查了很多资料和问了一些朋友,总算解决问题
在vc里用到了另外的一些分类,如有需要欢迎追问,互相学习。欢迎大神指点
群号:310800319
群号:246807516
步骤:
1.自定义collectionviewCell类
2.模型类
3. 在一个UIViewController里添加一个collectionView
第一步:自定义cell
在cell的.h 里:
#import#import "LocalWorkModel.h"
NS_ASSUME_NONNULL_BEGIN
@class LocalWorkCell;
typedef void(^CellSelectedHander)(LocalWorkCell * cell,BOOL isSelected);
@interface LocalWorkCell : UICollectionViewCell
/** model */
@property(nonatomic,strong)LocalWorkModel *model;
/** 选中图片 */
@property(nonatomic,strong)UIImageView *selectedImage;
/// 点击进行的回调
@property (nonatomic, copy)CellSelectedHander selectedHandler;
/// 表示选中
- (void)didSelected;
@end
在cell的.m 里:
#import "LocalWorkCell.h"
@interface LocalWorkCell ()
//图片
@property(nonatomic,weak) UIImageView *imageView;
@end
@implementation LocalWorkCell
//通过纯代码的方式创建此类实例 会调用该方法 在此方法中,添加子控件
- (instancetype)initWithFrame:(CGRect)frame{
if(self = [super initWithFrame:frame]){
UIImageView *imageView = [[UIImageView alloc] init];
[self addSubview:imageView];
self.imageView = imageView;
//选中cell的图片
UIImageView *selectedImage = [[UIImageView alloc]init];
[self addSubview:selectedImage];
self.selectedImage = selectedImage;
self.selectedImage.hidden = YES;
}
return self;
}
//当子控件发生变化(包括子控件增减和位置大小改变)时,都会调用此方法 来重新布局所有子控件
- (void)layoutSubviews{
[super layoutSubviews];
//设置 imageView 的 frame
// CGFloat imageViewX = 10;
// CGFloat imageViewY = 0;
// CGFloat imageViewW = self.cc_w - 2 * imageViewX;
// CGFloat imageViewH = imageViewW;
self.imageView.frame = CGRectMake(0, 0, self.cc_w + 5 , self.cc_h);
self.selectedImage.frame = self.imageView.frame;
}
//设置子控件的内容
-(void)setModel:(LocalWorkModel *)model{
_model = model;
self.imageView.image = [UIImage imageNamed:model.icon];
self.selectedImage.image = [UIImage imageNamed:@"cover_ selected"];
}
-(void)didSelected
{
self.selectedImage.hidden = !self.selectedImage.hidden;
if (self.selectedHandler) {
self.selectedHandler(self,!self.selectedImage.hidden);//已经隐藏表示需要移除
}
}
@end
第二步:模型类
在模型类的.h:
#import@interface LocalWorkModel : NSObject
//名称
@property(nonatomic,copy)NSString *name;
//图片
@property(nonatomic,copy)NSString *icon;
//快速创建实例
+ (instancetype)appWithDict:(NSDictionary *)dict;
@end
模型类的.m:
#import "LocalWorkModel.h"
@implementation LocalWorkModel
+ (instancetype)appWithDict:(NSDictionary *)dict{
//这样写会通用 可以把这个 作为代码块了
id obj = [[self alloc] init];
[obj setValuesForKeysWithDictionary:dict];
return obj;
}
@end
第三步:在一个UIViewController里添加一个collectionView
在.h里没有代码,所以直接.m:
#import "LocalWorkVC.h"
#import "UIBarButtonItem+Extension.h"
#import "LocalWorkCell.h"
#import "LocalWorkModel.h"
#import "PlayLocalVideoVC.h"
static NSString *ID = @"LocalWorkcell";
@interface LocalWorkVC ()@property(nonatomic,strong)UICollectionView *collectionview;
@property(nonatomic,strong)UICollectionViewFlowLayout *flowLayout;
/** 数组 */
@property(nonatomic,strong)NSMutableArray *models;
/** 操作本地数据的VIEW */
@property(nonatomic,strong)UIView *operationDataView;
@property(nonatomic,strong)UIButton *deleteButton;
//选中cell的图片获取
/** cell */
@property(nonatomic,strong)LocalWorkCell *selectedCellImage;
/// 表示选中的cache
@property (nonatomic, strong)NSMutableSet * cacheSet;
@end
@implementation LocalWorkVC
- (void)viewDidLoad {
[super viewDidLoad];
[self setupUI];
[self setupnavigation];
}
-(void)setupUI{
//1.创建 UICollectionView 实例
//1.1创建流水布局
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
// layout.itemSize = CGSizeMake(150, 150);
//1.2通过流水布局创建UICollectionView
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight-64) collectionViewLayout:layout];
//1.3设置UICollectionView的背景色
collectionView.backgroundColor = [UIColor whiteColor];
//1.4设置数据源
collectionView.dataSource = self;
collectionView.delegate = self;
//1.5添加到View中
[self.view addSubview:collectionView];
//1.6设置为全局变量
self.collectionview = collectionView;
//3 注册cell
[self.collectionview registerClass:[LocalWorkCell class] forCellWithReuseIdentifier:ID];
//弹出底部view
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:self.operationDataView];
[self.operationDataView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(0);
make.right.equalTo(0);
make.bottom.equalTo(0);
make.height.equalTo(44);
}];
self.operationDataView.hidden = YES;
//删除delete
[self.operationDataView addSubview:self.deleteButton];
[self.deleteButton mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.bottom.right.left.equalTo(0);
}];
//collection
[self.view addSubview:_collectionview];
//初始化模拟数据源
self.cacheSet = [NSMutableSet set];
}
-(void)setupnavigation{ self.title = @"本地作品"; self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName : [CCTools stringToColor:@"#333333"]}; //导航栏右边按钮,系统的不能修改,自己写个按钮上去 UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"选择" style:UIBarButtonItemStylePlain target:self action:@selector(navChooseRightButton)]; rightButton.tintColor = RGB(51, 51, 51); [rightButton setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"" size:17.0], NSForegroundColorAttributeName, nil] forState:UIControlStateNormal]; self.navigationItem.rightBarButtonItem = rightButton;}-(void)navChooseRightButton{ if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"选择"]) { [self.navigationItem.rightBarButtonItem setTitle:@"取消"]; self.operationDataView.hidden = NO; }else if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"取消"]){ [self.navigationItem.rightBarButtonItem setTitle:@"选择"]; self.operationDataView.hidden = YES; } }-(void)deleteEvent{ DLog(@"事件"); [self p_deleteHandler]; _deleteButton.userInteractionEnabled = NO; _deleteButton.alpha = 0.4;}#pragma mark - 进行删除操作- (void)p_deleteHandler{ //如果没有选择,return 这里也可以判断是否有选中的cell if (self.cacheSet.count == 0) { return; } //获得无序序列 NSArray * indexPaths = self.cacheSet.allObjects; //变为有序 NSSortDescriptor * descirptor = [NSSortDescriptor sortDescriptorWithKey:@"row" ascending:true]; NSArray* deleteIndexPath = [indexPaths sortedArrayUsingDescriptors:@[descirptor]];
//逆序删除数据源
for (NSInteger i = deleteIndexPath.count - 1; i >= 0; i--) {
NSInteger row = deleteIndexPath[i].row;
//删除
[self.models removeObjectAtIndex:row];
}
//刷新collectionView
[self.collectionview deleteItemsAtIndexPaths:deleteIndexPath];
//删除所有数据
[self.cacheSet removeAllObjects];
//返回
// [self.navigationController popViewControllerAnimated:true];
}
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:NO];
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:YES];
}
#pragma mark -2.实现数据源方法//2.1 返回多少组- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{ return 1;}//2.2 返回每组有多少item- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return self.models.count;}//2.3 返回每个item的cell- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ //获得可重用cell LocalWorkCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath]; __weak typeof(self) weakSelf = self; //设置交互回调 cell.selectedHandler = ^(LocalWorkCell * _Nonnull cell,BOOL isSelected) { /******** 使用回调获得indexPath **********/ //获得indexPath NSIndexPath * index = [weakSelf.collectionview indexPathForCell:cell]; if (isSelected) {//表示选中,添加indexPath至Set _deleteButton.userInteractionEnabled = YES; _deleteButton.alpha = 1.0; [weakSelf.cacheSet addObject:index]; } else { //移除 _deleteButton.userInteractionEnabled = NO; _deleteButton.alpha = 0.4; [weakSelf.cacheSet removeObject:index]; } }; //设置状态 cell.selectedImage.hidden = ![self.cacheSet containsObject:indexPath]; //给cell设置数据 cell.model = self.models[indexPath.item]; //返回cell return cell;}//_deleteButton.userInteractionEnabled = NO;//点击item(cell)方法- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{ DLog(@"indexPath= %ld",indexPath.row); if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"选择"]) { PUSH_CONTROL(PlayLocalVideoVC); } if ([self.navigationItem.rightBarButtonItem.title isEqualToString:@"取消"]){ //获得cell LocalWorkCell * cell = (LocalWorkCell *)[collectionView cellForItemAtIndexPath:indexPath]; [cell didSelected]; }}- (void)deleteItemsAtIndexPaths:(NSArray*)indexPaths{
[[[UICollectionView alloc] init] deleteItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]]];
}
//返回每一个cell的大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
return CGSizeMake(self.collectionview.cc_w / 3 -5, 150);
}
//设置每个item的UIEdgeInsets 组内边距
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(5, 0, 44, 0);
}
//cover_ selected
//设置最小行间距,也就是前一行与后一行的中间最小间隔 上下距离
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{
return 3;
}
// 设置最小列间距,也就是左行与右一行的中间最小间隔 左右距离
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
return 3;
}
#pragma mark -懒加载
-(NSMutableArray *)models{
if (_models == nil) {
//获得app.plist的路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"localWork.plist" ofType:nil];
//加载app.plist中的字典为数组
NSArray *arr = [NSArray arrayWithContentsOfFile:path];
NSMutableArray *array = [NSMutableArray array];
//字典转模型
for(NSDictionary *dict in arr){
LocalWorkModel *model = [LocalWorkModel appWithDict:dict];
[array addObject:model];
}
_models = array;
}
return _models;
}
-(UIView *)operationDataView{
if (_operationDataView == nil) {
_operationDataView = [[UIView alloc]init];
// _operationDataView.backgroundColor = [UIColor grayColor];
}
return _operationDataView;
}
-(UIButton *)deleteButton{
if (_deleteButton == nil) {
_deleteButton = [[UIButton alloc]init];
_deleteButton.backgroundColor = [UIColor redColor];
[_deleteButton setTitle:@"删 除" forState:UIControlStateNormal];
[_deleteButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_deleteButton.layer.cornerRadius = 4.5; // 设置圆角
[_deleteButton addTarget:self action:@selector(deleteEvent) forControlEvents:UIControlEventTouchUpInside];
_deleteButton.userInteractionEnabled = NO;
_deleteButton.alpha = 0.4;
}
return _deleteButton;
}
@end