iOS-列表自定义左滑删除

「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

前言

项目开发中tableView是一个很常用的UI控件, 系统的UITableView功能也已经是非常强大了, 其中有个一个功能, 可能是我们不会竞经常用到的, 那就是tableView中的左滑删除功能, 系统的左滑删除也是非常的好看了, 但是业务总是会有各种的起码需求, 那么我们会有自定义左滑删除样式的需求, 那么如果进行自定义的左滑删除就是今天要说的功能了.

实现

当tableView将要进入编辑状态的时候的操作

- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    // 这里需要放到主线程执行
    dispatch_async(dispatch_get_main_queue(), ^{
        [self setupSlideBtnWithEditingIndexPath:indexPath];
    });
}

复制代码

实现tableView的代理方法, 使tableView进入编辑状态的时候, 可以进行左滑删除以及后续的操作

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"删除标题" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
        // 删除点击后的操作
        [tableView setEditing:NO animated:YES];
    }];

    action.backgroundColor = hexColor(0xEB1163);
    return @[action];
}
复制代码

自定义左滑删除的样式.

在自定义左滑删除的时候需要判断 系统版本来操作, 不然就会有滑不动的情况发生

//MARK: - 设置左滑按钮的样式
- (void)setupSlideBtnWithEditingIndexPath:(NSIndexPath *)editingIndexPath {
    if (@available(iOS 13.0, *)) {
        for (UIView *subView in self.tableView.subviews) {
            if ([subView isKindOfClass:NSClassFromString(@"_UITableViewCellSwipeContainerView")] && [subView.subviews count] >= 1) {
                // 修改图片
                UIView *remarkContentView = subView.subviews.firstObject;
                [self setupRowActionView:remarkContentView];
            }
        }
        return;
    }

    // 判断系统是否是 iOS11 及以上版本
    if (@available(iOS 11.0, *)) {
        for (UIView *subView in self.tableView.subviews) {
            if ([subView isKindOfClass:NSClassFromString(@"UISwipeActionPullView")] && [subView.subviews count] >= 1) {
                // 修改图片
                UIView *remarkContentView = subView;
                [self setupRowActionView:remarkContentView];
            }
        }
        return;
    }

    // iOS11 以下的版本
    MTMineCollectionTableViewCell *cell = [self.tableView cellForRowAtIndexPath:editingIndexPath];
    for (UIView *subView in cell.subviews) {
        if ([subView isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")] && [subView.subviews count] >= 1) {
            // 修改图片
            UIView *remarkContentView = subView;
            [self setupRowActionView:remarkContentView];
        }
    }
}

- (void)setupRowActionView:(UIView *)rowActionView {
    // 切割圆角
    [rowActionView cl_setCornerAllRadiusWithRadiu:20];
    // 改变父 View 的frame,这句话是因为我在 contentView 里加了另一个 View,为了使划出的按钮能与其达到同一高度
    CGRect frame = rowActionView.frame;
    frame.origin.y += kFitRealValue(7);
    frame.size.height -= kFitRealValue(13);
    rowActionView.frame = frame;
    // 拿到按钮,设置图片
    UIButton *button = rowActionView.subviews.firstObject;
    [button setImage:kImageName(@"delete_col") forState:UIControlStateNormal];
    [button setTitle:@"" forState:UIControlStateNormal];
}
复制代码

猜你喜欢

转载自juejin.im/post/7032309325594886158