美文网首页表格相关ios开发整理
iOS 纯代码自定义collectionview,选中,删除ce

iOS 纯代码自定义collectionview,选中,删除ce

作者: 丶逝水流年 | 来源:发表于2017-04-01 10:46 被阅读767次

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

    相关文章

      网友评论

      • Zszen:这代码码的有点乱需要整理一下

      本文标题:iOS 纯代码自定义collectionview,选中,删除ce

      本文链接:https://www.haomeiwen.com/subject/xuuuottx.html