iOS 自定義側滑按鈕

研究了有一天了,剛找到方法去實現自定義圓角左滑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{

    

}

相關文章
相關標籤/搜索