自定义tableview的滑动删除

作者: 敲代码的小矮人 | 来源:发表于2016-05-19 14:47 被阅读974次

    1自定义tableview的删除

    近来有个需求,自定义tableview的滑动删除,查看了很多资料,没有找到合适的,就自己研究了下,这个方法可以根据你的需求任意的修改

    2下面就说下思路

    该需求是通过代理实现

    在tableviewcell里面创建你需要的按钮,像下面的代码一样添加到self.contentView上
    
    [self.contentView addSubview:deleteBtn];
    

    然后声明一个uiview,然后把这个view添加到self.contentView上,最后把这个view放到视图层的最上面即可

    @property(nonatomic,weak)UIView *containerView;
    
    UIView *containerView = [[UIView alloc] init];
        [self.contentView addSubview:containerView];
        self.containerView = containerView;
    
     [self.contentView bringSubviewToFront:self.containerView];  //设置containerView显示在最上层
    

    这时你要注意,你要把你想在cell上显示的东西,创建后,是添加到self.containerView上的

    下面就是添加滑动手势,添加了左右滑动手势,添加左右手势的好处是,当滑动这个时,另一个会关闭滑动

     //3、给容器containerView绑定左右滑动清扫手势
        UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
        leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft; //设置向左清扫
        [self.containerView addGestureRecognizer:leftSwipe];
        
        UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
        rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;//设置向右清扫
        [self.containerView addGestureRecognizer:rightSwipe];
    
    

    以上这些是UI界面上的实现
    下面说些cell里面的东西
    重写cell的构建方法
    .h

    //静态构造方法
    +(instancetype)cellWithTableView:(UITableView *)tableview;
    

    .m

    +(instancetype)cellWithTableView:(UITableView *)tableview
    {
        static NSString *reuseIdentity=@"cell";
       
       ZYJ_TableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:reuseIdentity];
        if (cell==nil) {
            cell=[[ZYJ_TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentity];
            
        }
        //cell.backgroundColor=[UIColor redColor];
        return cell;
    }
    

    然后重写cell的类型方法

    -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
            [self createUI];
            
        }
        return self;
    }
    

    以上就是在tableviewcell里面实现的主要代码
    下面是怎么在controller里面实现
    在controller里面创建tableview,和以往是一样的,不同点是在下面的这个函数里面

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    

    因为在cell里面已经重写了cell的构建方法,在该函数里面调用就行

    
       -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        ZYJ_TableViewCell *cell=[ZYJ_TableViewCell cellWithTableView:tableView];
        cell.delegate=self;//代理
        ZYJ_Model *model=self.dataArry[indexPath.row];
        NSLog(@"%@",model);
        //cell.backgroundColor=[UIColor brownColor];
        [cell showdataWith:model];
        return cell;
        
    }
    
    

    然后实现cell里面的代理方法即可

    -(void)deleteCell:(ZYJ_TableViewCell *)cell
    {
        NSIndexPath *path=[self.ZYJ_Tableview indexPathForCell:cell];
        [self.dataArry removeObjectAtIndex:path.row];
        [self.ZYJ_Tableview deleteRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationLeft];
        
    }
    -(void)closeOtherCellLeftSwipe
    {
        //循环显示的cell
        for (ZYJ_TableViewCell *item in self.ZYJ_Tableview.visibleCells) {
            [item closeSwipe];
        }
    }
    

    以上就是自定义tableview滑动删除的主要思路和主要代码
    下面是代码tableviewcell里面的代码

    @class ZYJ_TableViewCell;
    @protocol CellButtonEventViewDelegate <NSObject>
    
    @optional
    -(void)deleteCell:(ZYJ_TableViewCell *)cell; //删除cell
    - (void)closeOtherCellLeftSwipe;  //关闭其他单元格的左滑
    
    @end
    
    @interface ZYJ_TableViewCell : UITableViewCell
    //静态构造方法
    +(instancetype)cellWithTableView:(UITableView *)tableview;
    
    @property(nonatomic,strong)ZYJ_Model *model;
    -(void)showdataWith:(ZYJ_Model *)model;
    - (void)closeSwipe; //关闭滑动,恢复原样(用于在滑动当前单元格时,把其他已经左滑的单元格关闭)
    
    @property(nonatomic) BOOL isSwipMode;//是否滑动
    @property (nonatomic,weak) id <CellButtonEventViewDelegate> delegate;
    @end
    
    @interface ZYJ_TableViewCell()
    
    @property(nonatomic,weak)UIView *containerView;
    @property(nonatomic,weak)UILabel *showlable;
    @property(nonatomic,weak)UIButton *deleteBtn;
    @property(nonatomic,weak)UIView *underView;
    @property(nonatomic) BOOL isOpenLeft ;//是否已经打开左滑动
    
    
    @end
    @implementation ZYJ_TableViewCell
    
    - (void)awakeFromNib {
        // Initialization code
    }
    +(instancetype)cellWithTableView:(UITableView *)tableview
    {
        static NSString *reuseIdentity=@"cell";
       
       ZYJ_TableViewCell *cell = [tableview dequeueReusableCellWithIdentifier:reuseIdentity];
        if (cell==nil) {
            cell=[[ZYJ_TableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentity];
            
        }
        //cell.backgroundColor=[UIColor redColor];
        return cell;
    }
    
    -(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
    {
        self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
            [self createUI];
            
        }
        return self;
    }
    //初始化界面
    -(void)createUI
    {
       UIButton *deleteBtn =[UIButton buttonWithType:UIButtonTypeCustom];
        [self.contentView addSubview:deleteBtn];
        self.deleteBtn=deleteBtn;
        self.deleteBtn.backgroundColor=[UIColor redColor];
        [self.deleteBtn setTitle:@"删除" forState:UIControlStateNormal];
        [self.deleteBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        
        [self.deleteBtn addTarget:self action:@selector(deleteCell:) forControlEvents:UIControlEventTouchUpInside];
        
        UIView *containerView = [[UIView alloc] init];
        [self.contentView addSubview:containerView];
        self.containerView = containerView;
        self.containerView.backgroundColor=[UIColor orangeColor];
        self.containerView.backgroundColor = [UIColor whiteColor];
        
        UILabel *showLable=[[UILabel alloc]init];
        [self.containerView addSubview:showLable];
        self.showlable=showLable;
      
        self.showlable.textColor=[UIColor purpleColor];
        //self.showlable.backgroundColor=[UIColor redColor];
        UIView *underView=[[UIView alloc]init];
        [self.containerView addSubview:underView];
        self.underView=underView;
        self.underView.backgroundColor=[UIColor purpleColor];
        //3、给容器containerView绑定左右滑动清扫手势
        UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
        leftSwipe.direction = UISwipeGestureRecognizerDirectionLeft; //设置向左清扫
        [self.containerView addGestureRecognizer:leftSwipe];
        
        UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
        rightSwipe.direction = UISwipeGestureRecognizerDirectionRight;//设置向右清扫
        [self.containerView addGestureRecognizer:rightSwipe];
        self.selectionStyle = UITableViewCellSelectionStyleNone; //设置单元格选中样式
    
         [self.contentView bringSubviewToFront:self.containerView];  //设置containerView显示在最上层
        
    }
    //子控件的布局
    -(void)layoutSubviews
    {
        self.containerView.frame=self.contentView.bounds;
        self.deleteBtn.frame=CGRectMake(self.frame.size.width*0.8, 10, self.frame.size.width*0.2, 40);
        self.showlable.frame=CGRectMake(0, 0, 200, 30);
        self.underView.frame=CGRectMake(15, 59, self.frame.size.width-15, 1);
        
    }
    //设置要显示的时间
    -(void)showdataWith:(ZYJ_Model *)model
    {
     
        _model=self.model;
        self.showlable.text=model.title;
           NSLog(@"%@",model.title);
        
    }
    -(void)deleteCell:(UIButton *)btn
    {
        if ([self.delegate respondsToSelector:@selector(deleteCell:)]) {
            [self.delegate deleteCell:self];
            
        }
    }
    //滑动手势
    -(void)swipe:(UISwipeGestureRecognizer *)swipe
    {
        if (swipe.direction == UISwipeGestureRecognizerDirectionLeft){
            if (self.isOpenLeft) return; //已经打开左滑,不再执行
            
            //开始左滑: 先调用代理关闭其他cell的左滑
            if ([self.delegate respondsToSelector:@selector(closeOtherCellLeftSwipe)])
                [self.delegate closeOtherCellLeftSwipe];
            
            [UIView animateWithDuration:0.5 animations:^{
                swipe.view.center = CGPointMake(0, self.frame.size.height/2);
                self.containerView.frame=CGRectMake(-self.frame.size.width*0.2, 0, self.frame.size.width, 60.0f);
            }];
            self.isOpenLeft = YES;
        }
        else if (swipe.direction == UISwipeGestureRecognizerDirectionRight){
            [self closeSwipe]; //关闭左滑
        }
    
    }
    -(void)closeSwipe
    {
        if (!self.isOpenLeft) return; //还未打开左滑,不需要执行右滑
        
        [UIView animateWithDuration:0.5 animations:^{
            self.containerView.center = CGPointMake(self.frame.size.width/2 , self.frame.size.height/2 );
        }];
        self.isOpenLeft = NO;
    }
    
    

    相关文章

      网友评论

        本文标题:自定义tableview的滑动删除

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