一痊焊、iOS 11之前的處理方法
我們知道UITableViewCell默認的刪除按鈕樣式為紅色背景匾效、白色字體眼耀;怎么樣來修改按鈕的樣式呢宏多?網(wǎng)上查詢大多的做法是通過遍歷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;
}
}
}
}
}
在嘗試獲取這個刪除按鈕的時候試了不少方法,按網(wǎng)上說的cellforrow茄螃、cellwilldisplay等方法里都沒獲取到遏片;后來經(jīng)嘗試發(fā)現(xiàn)在cell的layoutsubviews方法里可以讀取到(自定義cell在正常狀態(tài)下有三個子view炒辉,contentView黑低、和兩個分割線view赘艳,編輯時會出現(xiàn)第四個view);因為contentView里面也可能會有button所以加了個位置判斷克握,如果view的左側(cè)超出屏幕右側(cè)說明是編輯view(刪除按鈕默認是在contentView的右側(cè));如果想完全自定義右側(cè)的刪除按鈕可以給這個button添加自定義視圖枷踏,大家可以自己嘗試一下菩暗;
然后刪除按鈕的標題修改系統(tǒng)提供了一個代理方法:
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"點擊刪除";
}
修改后效果如下圖:
效果圖
Demo地址
二、iOS 11之后的解決方法
0旭蠕、在iOS 11中系統(tǒng)修改了編輯按鈕的實現(xiàn)方式停团,新加入了一個UISwipeActionPullView類(沒有對外暴露),而且這個控件不是添加在cell里了掏熬,是tableview的subView佑稠。所以之前通過取cell的subView來修改樣式的方法行不通了。
1旗芬、iOS 11系統(tǒng)修改了編輯按鈕的實現(xiàn)方式舌胶,通過下面的兩個代理方法用戶可以配置多個編輯按鈕并自定部分樣式(可設置背景色,背景圖片等)疮丛。
- (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幔嫂、雖然通過系統(tǒng)的方法可以修改編輯按鈕的樣式,但系統(tǒng)提供的還不夠誊薄,不能完全自定義樣式履恩。所以可以按照以前的思路取出這個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]];
}
}
}
}
}