众所周知,在 iOS 里 UITableView 的左滑/侧滑删除的功能仍是挺美观的,最近项目的需求里就用到了这个样式 markdown
iOS cell自定义左滑/侧滑删除(支持iOS11)async
但iOS13 以上的系统左滑控件的层级以及类名都发生了变化,之前的方法明显不够用了,经过不断的断点分析,类名输出后终于正确的适配上了 iOS13,特在此记录一下ide
- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
// 这里的标题我使用的 4 个空格进行占位
UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@" " handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
// 点击删除按钮须要执行的方法
[tableView setEditing:NO animated:YES];
}];
// 修改背景颜色
action.backgroundColor = hexColor(0xEB1163);
return @[action];
}
复制代码
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath {
// 在 iOS11 如下系统,由于方法线程问题,须要放到主线程执行, 否则没有效果
dispatch_async(dispatch_get_main_queue(), ^{
[self setupSlideBtnWithEditingIndexPath:indexPath];
});
}
复制代码
//MARK: 设置左滑按钮的样式
- (void)setupSlideBtnWithEditingIndexPath:(NSIndexPath *)editingIndexPath {
// 判断系统是不是 iOS13 及以上版本
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];
}
复制代码
到这里咱们就已经实现咱们须要的效果了,可是在 iOS13 以上,有时候快速左滑/侧滑时并不能执行oop
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath;
spa
方法,因此会自定义不了按钮,可是轻轻滑动却能执行,目前不清楚是什么缘由,但愿知道的大佬能告诉一下,谢谢。线程