一、iOS 11之前的處理方法
我們知道UITableViewCell默認(rèn)的刪除按鈕樣式為紅色背景、白色字體;怎么樣來(lái)修改按鈕的樣式呢?網(wǎng)上查詢大多的做法是通過(guò)遍歷cell的subViews獲取這個(gè)刪除按鈕然后修改樣式;話不多說(shuō)直接上代碼:
- (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;
}
}
}
}
}
在嘗試獲取這個(gè)刪除按鈕的時(shí)候試了不少方法,按網(wǎng)上說(shuō)的cellforrow、cellwilldisplay等方法里都沒獲取到;后來(lái)經(jīng)嘗試發(fā)現(xiàn)在cell的layoutsubviews方法里可以讀取到(自定義cell在正常狀態(tài)下有三個(gè)子view,contentView、和兩個(gè)分割線view,編輯時(shí)會(huì)出現(xiàn)第四個(gè)view);因?yàn)閏ontentView里面也可能會(huì)有button所以加了個(gè)位置判斷,如果view的左側(cè)超出屏幕右側(cè)說(shuō)明是編輯view(刪除按鈕默認(rèn)是在contentView的右側(cè));如果想完全自定義右側(cè)的刪除按鈕可以給這個(gè)button添加自定義視圖,大家可以自己嘗試一下;
然后刪除按鈕的標(biāo)題修改系統(tǒng)提供了一個(gè)代理方法:
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"點(diǎn)擊刪除";
}
修改后效果如下圖:

效果圖
Demo地址
二、iOS 11之后的解決方法
0、在iOS 11中系統(tǒng)修改了編輯按鈕的實(shí)現(xiàn)方式,新加入了一個(gè)UISwipeActionPullView類(沒有對(duì)外暴露),而且這個(gè)控件不是添加在cell里了,是tableview的subView。所以之前通過(guò)取cell的subView來(lái)修改樣式的方法行不通了。
1、iOS 11系統(tǒng)修改了編輯按鈕的實(shí)現(xiàn)方式,通過(guò)下面的兩個(gè)代理方法用戶可以配置多個(gè)編輯按鈕并自定部分樣式(可設(shè)置背景色,背景圖片等)。
- (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、雖然通過(guò)系統(tǒng)的方法可以修改編輯按鈕的樣式,但系統(tǒng)提供的還不夠,不能完全自定義樣式。所以可以按照以前的思路取出這個(gè)UISwipeActionPullView然后拿到編輯按鈕修改樣式。因?yàn)檫@個(gè)控件是tableview的子控件所以我們可以自定義tableView類,然后通過(guò)layoutsubView方法來(lái)拿到這個(gè)控件,并修改它的樣式。
- (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]];
}
}
}
}
}