一、iOS 11之前的处理方法
我们知道UITableViewCell默认的删除按钮样式为红色背景、白色字体;怎么样来修改按钮的样式呢?网上查询大多的做法是通过遍历cell的subViews获取这个删除按钮然后修改样式;话不多说直接上代码:
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subView in self.subviews)
{
if (X(subView) >= WIDTH(self))
{
for (UIView *childView in subView.subviews)
{
if ([childView isKindOfClass:[UIButton class]])
{
UIButton *delBtn = (UIButton *)childView;
[delBtn setBackgroundColor:[UIColor orangeColor]];
[delBtn setTitleColor:[UIColor purpleColor] forState:(UIControlStateNormal)];
break;
}
}
}
}
}
在尝试获取这个删除按钮的时候试了不少方法,按网上说的cellforrow、cellwilldisplay等方法里都没获取到;后来经尝试发现在cell的layoutsubviews方法里可以读取到(自定义cell在正常状态下有三个子view,contentView、和两个分割线view,编辑时会出现第四个view);因为contentView里面也可能会有button所以加了个位置判断,如果view的左侧超出屏幕右侧说明是编辑view(删除按钮默认是在contentView的右侧);如果想完全自定义右侧的删除按钮可以给这个button添加自定义视图,大家可以自己尝试一下;
然后删除按钮的标题修改系统提供了一个代理方法:
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"点击删除";
}
修改后效果如下图:
Demo地址
二、iOS 11之后的解决方法
0、在iOS 11中系统修改了编辑按钮的实现方式,新加入了一个UISwipeActionPullView类(没有对外暴露),而且这个控件不是添加在cell里了,是tableview的subView。所以之前通过取cell的subView来修改样式的方法行不通了。
1、iOS 11系统修改了编辑按钮的实现方式,通过下面的两个代理方法用户可以配置多个编辑按钮并自定部分样式(可设置背景色,背景图片等)。
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
- (nullable UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos);
2、虽然通过系统的方法可以修改编辑按钮的样式,但系统提供的还不够,不能完全自定义样式。所以可以按照以前的思路取出这个UISwipeActionPullView然后拿到编辑按钮修改样式。因为这个控件是tableview的子控件所以我们可以自定义tableView类,然后通过layoutsubView方法来拿到这个控件,并修改它的样式。
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subView in self.subviews)
{
if ([subView isKindOfClass:NSClassFromString(@"UISwipeActionPullView")])
{
subView.backgroundColor = [UIColor orangeColor];
for (UIView *view in subView.subviews)
{
if ([view isKindOfClass:[UIButton class]])
{
UIButton *btn = (UIButton *)view;
[btn setTitleColor:[UIColor redColor] forState:(UIControlStateNormal)];
[btn setBackgroundColor:[UIColor orangeColor]];
}
}
}
}
}
网友评论