iOS UITableView 側滑


默認的側滑

實現以下方法,則可以得到默認的側滑刪除。並且在該方法處理點擊事件。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { [self.dataArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } 

得到以下效果:

 

 
default delete.png

修改標題

如果想要改變按鈕的問題,重寫以下方法設置即可:

- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { return @"返回"; } 
 
backTitle.png

側滑顯示多個按鈕

在iOS 8 之后,可以實現以下方法,可以得到多個按鈕,每個按鈕都是固定的寬度,設置太多會超出屏幕。而且,在block中處理不同按鈕的點擊事件。

- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewRowAction *editAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"編輯" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { // 收回側滑 [tableView setEditing:NO animated:YES]; }]; UITableViewRowAction *deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"刪除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) { // 刪除cell: 必須要先刪除數據源,才能刪除cell [self.dataArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; }]; return @[deleteAction, editAction, deleteAction, editAction]; } 
 
multiTitle.png
editAction.backgroundColor = [UIColor yellowColor]; 

其中,如果設置了UITableViewRowAction的背景顏色,則顯示用戶設置的。否則顯示系統默認的,Destructive是紅色,Normal 是淺灰色。

按鈕顯示圖標

有一個取巧的方法,可以用平鋪的圖片設置成UITableViewRowAction的backgroundColor, 但是這個圖標需要大一點,不然就會被平鋪了。

UIImage *image = [UIImage imageNamed:@"account_item_me"]; editAction.backgroundColor = [UIColor colorWithPatternImage:image]; 
 
bigImage.png

 

 
smallImage.png

iOS 11 之后,新增了兩個方法, 可以直接設置圖標。trailingSwipe是左滑,顯示右側菜單。leadingSwipe是右
滑,顯示左側菜單。

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { if (@available (iOS 11, *)) { UIContextualAction *deleteAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleDestructive title:@"刪除" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { if (self.dataArray.count > indexPath.row) { [self.dataArray removeObjectAtIndex:indexPath.row]; [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; } completionHandler(YES); }]; deleteAction.image = [UIImage imageNamed:@"public_system_success"]; UIContextualAction *backAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:nil handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { // 不做任何事 [tableView setEditing:NO animated:YES]; completionHandler(YES); }]; backAction.image = [UIImage imageNamed:@"public_system_success"]; UISwipeActionsConfiguration *configuration = [UISwipeActionsConfiguration configurationWithActions:@[deleteAction, backAction]]; return configuration; } return nil; } 

但是不知道哪里出錯了,沒有正確地顯示圖標,而是出現了白色圓圈。其實,應該是顯示跟Cell左側一樣的圖標才對。如果圖片太大的話,還會將其他的菜單給覆蓋了。

 

 
strangeWhiteImage.png

右滑,顯示左側的菜單,跟左滑的一樣。

- (UISwipeActionsConfiguration *)tableView:(UITableView *)tableView leadingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath *)indexPath { UIContextualAction *editAction = [UIContextualAction contextualActionWithStyle:UIContextualActionStyleNormal title:@"編輯" handler:^(UIContextualAction * _Nonnull action, __kindof UIView * _Nonnull sourceView, void (^ _Nonnull completionHandler)(BOOL)) { // 不做任何事,只是收回側滑 [tableView setEditing:NO animated:YES]; completionHandler(YES); }]; editAction.backgroundColor = [UIColor greenColor]; UISwipeActionsConfiguration *configuration = [UISwipeActionsConfiguration configurationWithActions:@[editAction]]; return configuration; } 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM