研究了有一天了,剛找到方法去實現自定義圓角左滑cell的刪除按鈕,主要是一步一步打印出UITableView的視圖層級(Xcode 9.0 iOS 10+)app
在UITableView的ViewController的- (void)viewDidLayoutSubviews實現。代理
iOS 11 (Xcode 9編譯): UITableView -> UISwipeActionPullView -> UISwipeActionStandardButtoncode
滑動展現的Delete按鈕在_tableVeiw.subviews上,打印出_tableVeiw.subviews,裏面有一個UISwipeActionStandardButton,取出這個按鈕就是刪除按鈕orm
UIButton *deleteButton = subview.subviews[0];ip
deleteButton.frame = CGRectMake(0, 5, 70, 110);it
deleteButton.backgroundColor = [UIColor whiteColor];io
[deleteButton setBackgroundImage:[UIImage imageNamed:@"Group 5"] forState:UIControlStateNormal];編譯
同時要實現代理table
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPathsso
{
self.editingIndexPath = indexPath;
[self.view setNeedsLayout]; // 觸發-(void)viewDidLayoutSubviews
}
- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
self.editingIndexPath = nil;
}
[self.view setNeedsLayout];必需要實現
如下是所有代碼
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (self.editingIndexPath)
{
[self configSwipeButtons];
}
}
- (void)configSwipeButtons
{
// 獲取選項按鈕的reference
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"11.0")){
for (UIView *subview in _tableVeiw.subviews)
{
subview.backgroundColor = [UIColor whiteColor];
if ([subview isKindOfClass:NSClassFromString(@"UISwipeActionPullView")])
{
NSLog(@"上面的視圖 %@",subview.subviews);
// 和iOS 10的按鈕順序相反
UIButton *deleteButton = subview.subviews[0];
deleteButton.frame = CGRectMake(0, 5, 70, 110);
// deleteButton.layer.cornerRadius = 10;
// deleteButton.layer.masksToBounds = YES;
deleteButton.backgroundColor = [UIColor whiteColor];
[deleteButton setBackgroundImage:[UIImage imageNamed:@"Group 5"] forState:UIControlStateNormal];
[self configDeleteButton:deleteButton];
[self centerImageAndTextOnButton:deleteButton];
}
}
}else{
// iOS 8-10層級: UITableView -> UITableViewCell -> UITableViewCellDeleteConfirmationView
NoticeTableVC *tableCell = [_tableVeiw cellForRowAtIndexPath:self.editingIndexPath];
for (UIView *subview in tableCell.subviews)
{
subview.backgroundColor = [UIColor whiteColor];
if ([subview isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")])
{
UIButton *deleteButton = subview.subviews[0];
[self configDeleteButton:deleteButton];
deleteButton.frame = CGRectMake(0, 5, 60, 110);
// deleteButton.layer.cornerRadius = 10;
// deleteButton.layer.masksToBounds = YES;
deleteButton.backgroundColor = [UIColor whiteColor];
[deleteButton setBackgroundImage:[UIImage imageNamed:@"Group 5"] forState:UIControlStateNormal];
[self configDeleteButton:deleteButton];
[self centerImageAndTextOnButton:deleteButton];
}
}
}
}
- (void)centerImageAndTextOnButton:(UIButton*)button
{
if (SYSTEM_VERSION_LESS_THAN(@"11.0"))
{
CGRect btnFrame = button.frame;
btnFrame.origin.y = 30;
button.frame = btnFrame;
}
}
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
self.editingIndexPath = indexPath;
[self.view setNeedsLayout]; // 觸發-(void)viewDidLayoutSubviews
}
- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
self.editingIndexPath = nil;
}
- (void)configDeleteButton:(UIButton*)deleteButton
{
if (deleteButton)
{
//點擊刪除按鈕觸發的方法
}
}
- (void)configReadButton:(UIButton*)readButton
{
if (readButton)
{
}
}
#pragma mark - 返回編輯模式,默認爲刪除模式
-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete;
}
- (nullable NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
return @"刪除";
}
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{//請求數據源提交的插入或刪除指定行接收者。
if (editingStyle == UITableViewCellEditingStyleDelete) {//若是編輯樣式爲刪除樣式
}else {
}
}
-(void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Tapped accessory button");
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
}