自定义UITableView左滑删除样式

最近在做番茄钟的项目,其中涉及到任务列表的界面,希望实现左滑删除的功能。UITableViewDelegate自带简单的左滑删除的接口,通过实现canEditRowAtIndexPath方法打开tableView可编辑的开关,再实现editActionsForRowAtIndexPath方法处理事件,UITableViewRowAction的实例允许修改文字和背景色。

而我的需求是想把删除键做成一个垃圾桶图标。而系统没有直接可用的API,那就只能曲线救国了。

首先,这个删除按钮在 iOS11 和 iOS11以下的系统中,所处的父级是不一样的。

在iOS11以前

删除按钮的父级是cell图。

iOS11+

删除按钮的父级类名为UISwipeActionPullViewUISwipeActionPullView的父级为UITableViewRowAction,也就是说UISwipeActionPullView和cell是同级的。

所以,两者需要以不同的方式实现。

在两种系统中,当还未左滑调出删除按钮时,输出cell或tableView的所有子视图,发现并没有删除按钮的存在。也就是说,他们是在需要的时候,被创建出来的。所以,我们需要重写某个方法去截获这个删除按钮。

在iOS11以前

重写insertSubview:atIndex方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void)insertSubview:(UIView *)view atIndex:(NSInteger)index {
[super insertSubview:view atIndex:index];
DLog(@"insertSubview");
if ([view isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")]) {
for (UIButton *btn in view.subviews) {

if ([btn isKindOfClass:[UIButton class]]) {
[btn setBackgroundColor:[UIColor clearColor]];
[btn mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(adaptWidth(35));
make.height.mas_equalTo(adaptWidth(35));
make.centerX.mas_equalTo(0);
make.centerY.mas_equalTo(0);
}];

[btn setTitle:nil forState:UIControlStateNormal];
UIImage *img = [IMAGE(@"list_deleting") imageForThemeColor:[UIColor redColor]];
[btn setImage:img forState:UIControlStateNormal];
[btn setImage:img forState:UIControlStateHighlighted];
}
}
}
}

iOS11+

新建并使用一个继承于UITableView的控件,重写layoutSubviews方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- (void)layoutSubviews{
[super layoutSubviews];

//iOS11版本以上,自定义删除按钮:
if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 11.0) {
for (UIView *subview in self.subviews)
{
if([subview isKindOfClass:NSClassFromString(@"UISwipeActionPullView")])
{
UIView *swipeActionPullView = subview;
swipeActionPullView.backgroundColor = [UIColor clearColor];

UIButton *swipeActionStandardBtn = subview.subviews[0];
if ([swipeActionStandardBtn isKindOfClass:NSClassFromString(@"UISwipeActionStandardButton")]) {

[swipeActionStandardBtn mas_updateConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(adaptWidth(35));
make.height.mas_equalTo(adaptWidth(35));
make.left.mas_equalTo(0);
make.centerY.mas_equalTo(0);
}];
[swipeActionStandardBtn setTitle:nil forState:UIControlStateNormal];
[swipeActionStandardBtn setImage:[IMAGE(@"list_deleting") imageForThemeColor:[UIColor redColor]] forState:UIControlStateNormal];
}
}
}
}
}

*在iOS11以前,左滑cell不会走layoutSubviews的方法。在iOS11上,左滑时tableView不会走insertSubview:atIndex方法。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信