美文网首页
UITableView 轻松自定义多选cell 不使用系统样式

UITableView 轻松自定义多选cell 不使用系统样式

作者: Adgerc | 来源:发表于2022-11-25 02:46 被阅读0次

    1、先看效果

    UITableView.gif

    2、需要什么效果

    1.点击全选需要全选cell
    
    2.在全选状态下,取消任意一个,全选按钮为 normal 转态
    
    3.一个一个选择,直到全部选择,全选按钮为 selected 状态
    

    3、实现

    3.1.在cell中添加一个 按钮 或者 图片,用来显示选择或者未选择中的转态,在初始化时 默认设为 未选择的转态或者图片,和透明度为0或hidden = YES ,我使用的是按钮做这个状态的现实,只需要UIControlStateNormal和UIControlStateSelected状态下的图片,不需要实现点击事件
    
    RSButton* selectedButton = [[RSButtonalloc]initWithType:RSButtonTypeOnlyImage];
    
    selectedButton.alpha=0.0;
    
    [selectedButtonsetImage:[UIImage imageNamed:@"rs_common_selected_normal_2"] forState:UIControlStateNormal];
    
    [selectedButtonsetImage:[UIImage imageNamed:@"rs_common_selected_selected_2"] forState:UIControlStateSelected];
    
    [viewaddSubview:selectedButton];
    
    self.selectedButton= selectedButton;
    
    
    3.2.重写UITableViewCell的方法
    
    
    - (void)setSelected:(BOOL)selectedanimated:(BOOL)animated {
    
        [supersetSelected:selectedanimated:animated];
    
        self.selectedButton.selected= selected;
    
    }
    
    
    以上代码就可以实现 cell 在点击的时候,改变按钮的图片显示
    

    4、设置UITableView

    4.1.设置UITableView 是否可以多选
    
    
            _tableView.allowsMultipleSelection = YES;
    
    
    4.2.点击 编辑 让 UITableView 进入多选状态(编辑状态)让按钮从隐藏状态显示出来
    
        4.2.1 重写UITableViewCell 的方法,显示或隐藏按钮,在UITableView 进入编辑状态的时候会调用
    
        -(void)setEditing:(BOOL)editing animated:(BOOL)animated {    
    
            // [super setEditing:editing animated:animated]; 这里不要调用super 不然显示是系统自带的样式
    
            [UIView animateWithDuration:0.2
    
                             animations:^{
    
                   self.selectedButton.alpha= editing ?1.0:0.0;
    
            }];
    
       }
    
    
        4.2.2 点击 编辑的时候 让UITableView 进入编辑转态
    
        /// 编辑按钮点击事件
    
        - (void)editAction:(UIButton*)sender {
    
            sender.selected= !sender.selected;
    
            [self.tableView setEditing:sender.selected animated:YES]; // 这个就会调用 2.1 中的代码 显示或隐藏 cell中的 按钮
    
        }
    
    
        4.2.3 设置 UITableViewDelegate 中的代码,
    
        - (void)tableView:(UITableView*)tableViewdidSelectRowAtIndexPath:(NSIndexPath*)indexPath {
    
                if(tableView.isEditing) {// 判断一下是不是编辑状态
    
                [tableViewselectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
    
                self.selectedIndexPaths = tableView.indexPathsForSelectedRows; // 获取 UITableView 当前选中的 cell
    
            }else{    
    
            }
    
        }
    
        - (void)tableView:(UITableView*)tableViewdidDeselectRowAtIndexPath:(NSIndexPath*)indexPath{
    
                if(tableView.isEditing) { // 判断一下是不是编辑状态
    
                [tableViewdeselectRowAtIndexPath:indexPathanimated:YES];
    
                self.selectedIndexPaths = tableView.indexPathsForSelectedRows; // 获取 UITableView 当前选中的 cell
    
            }
    
        }
    
        4.2.4 必须设置 不然在 UITableView 在编辑状态下 无法响应 4.2.3 中的代码
    
        - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    
            return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
    
        }
    

    5、设置记录 选择的 数组

    5.1 添加属性
    
    @interfaceRSFamilyListController()
    
    @property (strong,  nonatomic) UITableView * tableView;
    
    @property (weak,    nonatomic) RSView * editView;
    
    @property (weak,    nonatomic) RSButton * checkAllButton; // 全选按钮 它在  editView上 点击编辑的时候隐藏或显示
    
    @property (strong,  nonatomic) NSArray * datas; /// 源数据
    
    @property (strong,  nonatomic) NSArray * selectedIndexPaths; /// 记录选择中的 cell 4.2.3 和 4.2.4 中的代码有
    
    @end
    
    
    5.2 重写 selectedIndexPaths set方法,用来判断是不是 全全部选中
    
    
    
    - (void)setSelectedIndexPaths:(NSArray *)selectedIndexPaths {
    
        _selectedIndexPaths = selectedIndexPaths;
    
        // 判断一下 选择的数量是不是等于源数据的数量,这就可以 显示 按钮的 UIControlStateNormal 状态 或者 UIControlStateNormal 状态
    
        self.checkAllButton.selected = (selectedIndexPaths.count == self.datas.count);
    
    }
    

    6、 到这里就差不多了,下面是完整代码,可以直接复制使用
    RSFamilyListController.h

    #import "RSViewController.h"
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface RSFamilyListController : RSViewController
    
    @end
    
    @interface RSFamilyListCell : UITableViewCell
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    RSFamilyListController.m

    
    #import "RSFamilyListController.h"
    #import "RSInsertFamilyListController.h"
    
    
    @interface RSFamilyListController ()<UITableViewDelegate,UITableViewDataSource>
    @property (strong,  nonatomic) UITableView * tableView;
    @property (weak,    nonatomic) RSView * editView;
    @property (weak,    nonatomic) RSButton * checkAllButton;
    @property (strong,  nonatomic) NSArray * datas;
    @property (strong,  nonatomic) NSArray * selectedIndexPaths;
    
    @end
    
    @implementation RSFamilyListController(Action)
    
    /// 编辑点击事件
    - (void)editAction:(UIButton *)sender {
        sender.selected = !sender.selected;
        MJWeakSelf;
        [UIView animateWithDuration:0.25
                         animations:^{
            weakSelf.editView.alpha = sender.selected ? 1.0 : 0.0;
            weakSelf.editView.hidden = !sender.selected;
        }];
        
        
        [self.tableView setEditing:sender.selected animated:YES];
    }
    
    /// 添加家人点击事件
    - (void)insertAction {
        [self.navigationController pushViewController:[RSInsertFamilyListController new]
                                             animated:YES];
    }
    - (void)checkAllAction:(RSButton *) sender {
        sender.selected = !sender.selected;
            for (int i = 0; i < self.datas.count; i++) {
                if (sender.selected) {
    
                [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] animated:YES scrollPosition:UITableViewScrollPositionNone];
            } else {
                [self.tableView deselectRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] animated:YES];
            }
        }
    }
    @end
    
    @implementation RSFamilyListController(Protocol)
    #pragma mark - UITableViewDelegate & UITableViewDataSource
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.datas.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        RSFamilyListCell * cell = [tableView dequeueReusableCellWithIdentifier:@"RSFamilyListCell"];
        if (!cell) {
            cell = [[RSFamilyListCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"RSFamilyListCell"];
        }
        return cell;
    }
    
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        if (tableView.isEditing) {
            [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone];
            self.selectedIndexPaths = tableView.indexPathsForSelectedRows;
        } else {
            
        }
    }
    - (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath{
        if (tableView.isEditing) {
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
            self.selectedIndexPaths = tableView.indexPathsForSelectedRows;
        }
        
    }
    
    
    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
        return UITableViewCellEditingStyleDelete | UITableViewCellEditingStyleInsert;
    }
    
    
    
    
    @end
    
    @implementation RSFamilyListController
    - (UITableView *)tableView {
        if (!_tableView) {
            _tableView = [[UITableView alloc]init];
            _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
            _tableView.allowsMultipleSelection = YES;
        }
        return _tableView;
    }
    
    - (void)setSelectedIndexPaths:(NSArray *)selectedIndexPaths {
        _selectedIndexPaths = selectedIndexPaths;
        
        self.checkAllButton.selected = (selectedIndexPaths.count == self.datas.count);
    }
    
    -(NSArray *) datas{
        return @[@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1",@"1"];
    }
    
    - (BOOL)navigationBarHiddenShadowImage{
        return YES;
    }
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self loadNavigationBar];
        [self loadSubViews];
    }
    
    - (void)loadNavigationBar {
        self.navigationItem.title = @"家人相亲库";
        
        UIButton * rightButton = [[UIButton alloc]init];
        rightButton.titleLabel.font = [UIFont systemFontOfSize:10.0];
        [rightButton setTitle:@"编辑" forState:UIControlStateNormal];
        [rightButton setTitleColor:RSColor.F33333 forState:UIControlStateNormal];
        [rightButton addTarget:self action:@selector(editAction:) forControlEvents:UIControlEventTouchUpInside];
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:rightButton];
    
    }
    
    - (void)loadSubViews {
        
        RSView * bottomView = [[RSView alloc]init];
        bottomView.backgroundColor = RSColor.FFFFFF;
        [self.view addSubview:bottomView];
        
        [bottomView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.right.equalTo(self.view);
            make.height.offset(56);
            make.bottom.offset(UIScreen.bottomSafeHeight);
        }];
        
        self.tableView.delegate = self;
        self.tableView.dataSource = self;
        [self.tableView registerClass:RSFamilyListCell.class forCellReuseIdentifier:@"RSFamilyListCell"];
        self.tableView.backgroundColor = self.view.backgroundColor;
        [self.view addSubview:self.tableView];
        
        [self.tableView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.right.equalTo(self.view);
            make.bottom.equalTo(bottomView.mas_top);
        }];
        
        [self loadSubViewsWithBottom:bottomView];
    }
    
    - (void)loadSubViewsWithBottom:(UIView *) view {
        
        
        UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.titleLabel.font = [UIFont systemFontOfSize:16.0];
        [button setTitle:@"新增家人信息" forState:UIControlStateNormal];
        [button setBackgroundImage:[UIImage imageWithGradientColors:@[RSColor.F98D5C,RSColor.FF6999]] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(insertAction) forControlEvents:UIControlEventTouchUpInside];
        [button acs_radiusWithRadius:18.0 corner:UIRectCornerAllCorners];
        [view addSubview:button];
        
        [button mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.offset(12.0);
            make.right.offset(-12.0);
            make.height.offset(36.0);
            make.centerY.equalTo(view);
        }];
        
        RSView * editView = [[RSView alloc]init];
        editView.alpha = 0.0;
        editView.hidden = YES;
        editView.backgroundColor = view.backgroundColor;
        [view addSubview:editView];
        self.editView = editView;
        
        [editView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(view);
        }];
        
        
        RSButton * checkAllButton = [[RSButton alloc]initWithType:RSButtonTypeLeft];
        checkAllButton.titleLabel.textColor = RSColor.F66666;
        checkAllButton.titleLabel.font = [UIFont systemFontOfSize:14.0];
        [checkAllButton setTitle:@"全选" forState:UIControlStateNormal];
        [checkAllButton setImage:[UIImage imageNamed:@"rs_common_selected_normal_2"] forState:UIControlStateNormal];
        [checkAllButton setImage:[UIImage imageNamed:@"rs_common_selected_selected_2"] forState:UIControlStateSelected];
        [checkAllButton addTarget:self action:@selector(checkAllAction:) forControlEvents:UIControlEventTouchUpInside];
        [editView addSubview:checkAllButton];
        self.checkAllButton = checkAllButton;
        
        [checkAllButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.offset(12.0);
            make.centerY.equalTo(editView);
        }];
     
        UIButton * doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
        doneButton.titleLabel.font = [UIFont systemFontOfSize:14.0];
        [doneButton setTitle:@"发布" forState:UIControlStateNormal];
        [doneButton setBackgroundImage:[UIImage imageWithColor:RSColor.F2F2F2] forState:UIControlStateNormal];
    
        [doneButton setBackgroundImage:[UIImage imageWithGradientColors:@[RSColor.F98D5C,RSColor.FF6999]] forState:UIControlStateSelected];
        [doneButton acs_radiusWithRadius:15.0 corner:UIRectCornerAllCorners];
        [editView addSubview:doneButton];
        
        [doneButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.offset(-12.0);
            make.width.offset(68.0);
            make.height.offset(30.0);
            make.centerY.equalTo(view);
        }];
    
    }
    @end
    
    @interface RSFamilyListCell ()
    @property (weak,  nonatomic) RSButton * selectedButton;
    @end
    
    
    @implementation RSFamilyListCell(Common)
    - (UILabel *)customLabel {
        UILabel * laebl = [[UILabel alloc]init];
        laebl.font = [UIFont systemFontOfSize:10.0];
        laebl.textColor = RSColor.F33333;
        laebl.text = @"--";
        return laebl;
    }
    
    - (YYLabel *)customYYLabel {
        YYLabel * laebl = [[YYLabel alloc]init];
        laebl.font = [UIFont systemFontOfSize:10.0];
        laebl.text = @"--";
        laebl.textColor = RSColor.F33333;
        return laebl;
    
    }
    @end
    
    
    
    @implementation RSFamilyListCell
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
        self.selectedButton.selected = selected;
    }
    
    
    -(void)setEditing:(BOOL)editing animated:(BOOL)animated {
        MJWeakSelf;
        [UIView animateWithDuration:0.2
                         animations:^{
            weakSelf.selectedButton.alpha = editing ? 1.0 : 0.0;
        }];
    }
    
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
        if (self) {
            self.backgroundColor = UIColor.clearColor;
            self.selectionStyle = UITableViewCellSelectionStyleNone;
            [self loadSubViews];
        }
        return self;
    }
    
    - (void)loadSubViews {
        
        RSView * view = [[RSView alloc]init];
        view.backgroundColor = RSColor.FFFFFF;
        [view acs_radiusWithRadius:8.0 corner:UIRectCornerAllCorners];
        [self.contentView addSubview:view];
        [view mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.offset(12.0);
            make.right.offset(-12.0);
            make.bottom.equalTo(self.contentView);
            make.top.offset(10.0);
        }];
        
        
        UIImageView * portraitView = [[UIImageView alloc] init];
        portraitView.backgroundColor = RSColor.F2F2F2;
        [view addSubview:portraitView];
        
        [portraitView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.bottom.equalTo(view);
            make.width.height.offset(103);
        }];
        
        
        
        RSView * infoView = [[RSView alloc]init];
        [view addSubview:infoView];
        
        [infoView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(portraitView.mas_right).offset(10.0);
            make.right.offset(0.0);
            make.top.offset(10.0);
            make.bottom.offset(-10.0);
        }];
        
        [self loadSubViewsWithInfoView:infoView];
    }
    
    - (void)loadSubViewsWithInfoView:(UIView *) view {
        RSButton * selectedButton = [[RSButton alloc] initWithType:RSButtonTypeOnlyImage];
        selectedButton.alpha = 0.0;
        [selectedButton setImage:[UIImage imageNamed:@"rs_common_selected_normal_2"] forState:UIControlStateNormal];
        [selectedButton setImage:[UIImage imageNamed:@"rs_common_selected_selected_2"] forState:UIControlStateSelected];
        [view addSubview:selectedButton];
        self.selectedButton = selectedButton;
        
        [selectedButton mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.top.equalTo(view);
            make.width.height.offset(12.0);
        }];
        
        
        YYLabel * label1 = [self customYYLabel];
        [view addSubview:label1];
        [label1 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.top.equalTo(view);
            make.right.equalTo(selectedButton.mas_left).offset(-5.0);
        }];
        
        YYLabel * label2 = [self customYYLabel];
        [view addSubview:label2];
        
        [label2 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.right.equalTo(view);
            make.top.equalTo(label1.mas_bottom);
            make.height.equalTo(label1);
        }];
        
        UILabel * label3 = [self customLabel];
        [view addSubview:label3];
        
        [label3 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(view);
            make.top.equalTo(label2.mas_bottom);
            make.height.equalTo(label2);
        }];
    
        UILabel * label4 = [self customLabel];
        [view addSubview:label4];
        
        [label4 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.left.equalTo(label3.mas_right);
            make.top.width.height.equalTo(label3);
        }];
    
        UILabel * label5 = [self customLabel];
        [view addSubview:label5];
        
        [label5 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.right.equalTo(view);
            make.left.equalTo(label4.mas_right);
            make.width.height.top.equalTo(label4);
        }];
    
        UILabel * label6 = [self customLabel];
        [view addSubview:label6];
        
        [label6 mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(label5.mas_bottom);
            make.height.equalTo(label5);
            make.bottom.equalTo(view);
            make.left.right.equalTo(view);
        }];
    
    }
    @end
    
    

    相关文章

      网友评论

          本文标题:UITableView 轻松自定义多选cell 不使用系统样式

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