iOS 纯代码自定义collectionview,选中,删除cell效果

由于没有用过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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,326评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,228评论 1 304
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,979评论 0 252
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,489评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,894评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,900评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,075评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,803评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,565评论 1 249
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,778评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,255评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,582评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,254评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,151评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,952评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,035评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,839评论 2 277

推荐阅读更多精彩内容