亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS自定義UITableView實現不同系統下的左滑刪除功能詳解

2019-10-21 18:39:51
字體:
來源:轉載
供稿:網友

前言

在我們的app開發當中,經常會用到UITableView左滑刪除的功能,通常的話效果如下 

iOS,UITableView,左滑刪除

但有時候系統現有的功能并不能完全滿足我們的開發需求,這樣就需要我們在其現有的功能基礎上自定義我們所需要的功能了。下圖是在項目中自定義的按鈕(只是修改了按鈕的frame而已)。

iOS,UITableView,左滑刪除

然后我就總結了一下根據不同的需求自定義不同的按鈕。

一、系統默認左滑刪除按鈕

如果你對左滑刪除按鈕的要求不高,僅僅只是實現UITableView上cell的左滑刪除功能,那在UITableView的代理方法中添加以下兩種方法便可實現需求:

//使用系統默認的刪除按鈕- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { if (editingStyle == UITableViewCellEditingStyleDelete){ }}//自定義系統默認的刪除按鈕文字- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { return @"自定義按鈕”;}

效果如下所示:

iOS,UITableView,左滑刪除
系統自帶

雖然這樣能基本實現功能,但是我們發現右邊的按鈕和左邊的黃色區域的高度并不一樣。這是因為右邊按鈕是和UITableViewCell的高度一致,而左邊的黃色區域只是一張圖片而已,其高度設置和UITableViewCell的高度并不一致,才會導致這樣的布局出現。如果我們想要刪除按鈕和左邊圖片一樣的高度,那我們就需要自定義刪除按鈕的高度了。

二、自定義左滑刪除按鈕

如果我們想要實現不止一個自定義按鈕的功能,那我們就需要在UITableView代理方法- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {}中添加我們所需要的多個按鈕了。如下是在不同的cell上添加一個或兩個左滑按鈕:

//自定義多個左滑菜單選項- (NSArray<UITableViewRowAction *> *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewRowAction *deleteAction; deleteAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"刪除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { [tableView setEditing:NO animated:YES];//退出編輯模式,隱藏左滑菜單 }]; if (indexPath.row == 1) {//在不同的cell上添加不同的按鈕 UITableViewRowAction *shareAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"分享" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {  [tableView setEditing:NO animated:YES];//退出編輯模式,隱藏左滑菜單 }]; shareAction.backgroundColor = [UIColor blueColor]; return @[deleteAction,shareAction]; } return @[deleteAction];}

在上述代理方法中我們就可以實現在cell中添加一個或多個左滑按鈕了,根據點擊不同的按鈕實現不同的響應方法便可。其中[tableView setEditing:NO animated:YES];方法可以在點擊按鈕之后退出編輯模式并隱藏左滑菜單。但如果我們想要修改按鈕的其他屬性如標題、背景顏色怎么辦?點擊進入UITableViewRowAction類中,我們會發現以下屬性和方法:

@interface UITableViewRowAction : NSObject <NSCopying>+ (instancetype)rowActionWithStyle:(UITableViewRowActionStyle)style title:(nullable NSString *)title handler:(void (^)(UITableViewRowAction *action, NSIndexPath *indexPath))handler;@property (nonatomic, readonly) UITableViewRowActionStyle style;@property (nonatomic, copy, nullable) NSString *title;@property (nonatomic, copy, nullable) UIColor *backgroundColor; // default background color is dependent on style@property (nonatomic, copy, nullable) UIVisualEffect* backgroundEffect;@end

其中 @property (nonatomic, readonly) UITableViewRowActionStyle style;是指設置所添加按鈕父視圖的背景顏色以及按鈕字體顏色:

typedef NS_ENUM(NSInteger, UITableViewRowActionStyle) { UITableViewRowActionStyleDefault = 0,//紅底白字 UITableViewRowActionStyleDestructive = UITableViewRowActionStyleDefault, UITableViewRowActionStyleNormal//灰底白字} NS_ENUM_AVAILABLE_IOS(8_0) __TVOS_PROHIBITED;

@property (nonatomic, copy, nullable) UIVisualEffect* backgroundEffect;提供了一個背景模糊效果,有興趣的可以自行研究一下。

上述的方法和屬性只能滿足我們的部分需求,如果我們想要改變按鈕的大小或者設置帶圖片的按鈕怎么辦?那就需要我們在視圖中找到我們所要修改的按鈕,并設置它的各種屬性。由于在iOS8-10和iOS11下自定義按鈕處在不同的視圖層次中,所以需要我們先了解UITableView上的視圖層次。下圖為對比:

iOS,UITableView,左滑刪除

左iOS10/右iOS11(Xcode9中)

從對比圖中可以看出:

(1).iOS10下視圖層次為:UITableView -> UITableViewCell -> UITableViewCellDeleteConfirmationView -> _UITableViewCellActionButton,我們所需自定義的按鈕視圖UITableViewCellDeleteConfirmationView(左圖中紅框處)是UITableViewCell的子視圖。

(2).iOS11下視圖層次為:在Xcode 8中編譯為: UITableView -> UITableViewWrapperView -> UISwipeActionPullView -> UISwipeActionStandardButton;

在Xcode 9中編譯為: UITableView -> UISwipeActionPullView -> UISwipeActionStandardButton。(iOS11中用Xcode 8和Xcode 9中編譯有略微的差別),我們所需自定義的按鈕視圖UISwipeActionPullView(右圖中紅框處)是UITableView的子視圖。

由于不同系統下的視圖層次不一樣,因此我們在項目中需要根據不同的代碼去同時適配iOS8-10和iOS11。
在iOS8-10中( 以下均在Xcode 9中編譯):

在該系統下由于我們所需自定義的按鈕視圖UITableViewCellDeleteConfirmationView是UITableViewCell的子視圖,所以我們在自定義UITableViewCell子類中遍歷它的subviews即可。代碼如下:

- (void)layoutSubviews { /**自定義設置iOS8-10系統下的左滑刪除按鈕大小*/ for (UIView * subView in self.subviews) { if ([subView isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")]) {  subView.backgroundColor = [UIColor clearColor];//去掉默認紅色背景  //設置按鈕frame  CGRect cRect = subView.frame;  cRect.origin.y = self.contentView.frame.origin.y + 10;  cRect.size.height = self.contentView.frame.size.height - 20;  subView.frame = cRect;  //自定義按鈕的文字大小  if (subView.subviews.count == 1 && self.indexPath.section == 0) {//表示有一個按鈕  UIButton * deleteButton = subView.subviews[0];  deleteButton.titleLabel.font = [UIFont systemFontOfSize:20];  }  //自定義按鈕的圖片  if (subView.subviews.count == 1 && self.indexPath.section == 1) {//表示有一個按鈕  UIButton * deleteButton = subView.subviews[0];  [deleteButton setImage:[UIImage imageNamed:@"login_btn_message"] forState:UIControlStateNormal];  [deleteButton setTitle:@"" forState:UIControlStateNormal];  }  //自定義按鈕的文字圖片  if (subView.subviews.count >= 2 && self.indexPath.section == 0) {//表示有兩個按鈕  UIButton * deleteButton = subView.subviews[1];  UIButton * shareButton = subView.subviews[0];  [deleteButton setTitle:@"" forState:UIControlStateNormal];  [shareButton setTitle:@"" forState:UIControlStateNormal];  [self setUpDeleteButton:deleteButton];  [self setUpShareButton:shareButton];  } } }}

在iOS11中:

在該系統下由于我們所需自定義的按鈕視圖UISwipeActionPullView是UITableView的子視圖,所以我們可以在控制器中自定義UITableView子類中遍歷它的subviews即可(以下方法是寫在UITableView的代理方法- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath中的,該代理方法每次會在開始左滑按鈕前調用)。代碼如下:

/**自定義設置iOS11系統下的左滑刪除按鈕大小*///開始編輯左滑刪除- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath { NSInteger section = indexPath.section; if (@available(iOS 11.0, *)) {  for (UIView * subView in self.customTableView.subviews) {   if ([subView isKindOfClass:NSClassFromString(@"UISwipeActionPullView")]) {    subView.backgroundColor = [UIColor clearColor];//如果自定義只有一個按鈕就要去掉按鈕默認紅色背景    //設置按鈕frame    for (UIView * sonView in subView.subviews) {     if ([sonView isKindOfClass:NSClassFromString(@"UISwipeActionStandardButton")]) {      CGRect cRect = sonView.frame;      cRect.origin.y = sonView.frame.origin.y + 10;      cRect.size.height = sonView.frame.size.height - 20;      sonView.frame = cRect;     }    }    //自定義按鈕的文字大小    if (subView.subviews.count == 1 && section == 0) {//表示有一個按鈕     UIButton * deleteButton = subView.subviews[0];     deleteButton.titleLabel.font = [UIFont systemFontOfSize:20];    }    //自定義按鈕的圖片    if (subView.subviews.count == 1 && section == 1) {//表示有一個按鈕     UIButton * deleteButton = subView.subviews[0];     [deleteButton setImage:[UIImage imageNamed:@"login_btn_message"] forState:UIControlStateNormal];;    }    //自定義按鈕的文字圖片    if (subView.subviews.count >= 2 && section == 0) {//表示有兩個按鈕     UIButton * deleteButton = subView.subviews[1];     UIButton * shareButton = subView.subviews[0];     [self setUpDeleteButton:deleteButton];     [self setUpShareButton:shareButton];    }   }  } }}

如果我們想在左滑刪除結束后實現一些功能,我們可以在UITableView中實現以下代理方法:

//結束編輯左滑刪除- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath {}如果我們想分別設置UITableViewCell是否需要實現左滑功能,可以在下面代理方法中實現://判斷是否顯示左滑刪除- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES;}

在不同系統下分別添加以上代碼即可實現我們所需要的自定義左滑刪除按鈕,效果圖如下:

iOS,UITableView,左滑刪除

以上是我總結整理的在不同系統下的自定義UITableView左滑刪除功能。

如有不足之處,歡迎指正交流,Demo地址:左滑刪除

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕自拍vr一区二区三区| 91精品久久久久久久久久| 成人妇女淫片aaaa视频| 国产日韩中文字幕| 国产精品黄色影片导航在线观看| 成人情趣片在线观看免费| 亚洲欧美国产精品专区久久| 播播国产欧美激情| www国产精品com| 午夜精品久久久久久99热软件| 日韩欧美成人网| 日韩专区在线播放| 久久九九亚洲综合| 亚洲一区中文字幕| 91在线视频一区| 国产精品久久久久久久久影视| 红桃视频成人在线观看| 日韩国产欧美精品在线| 欧美国产亚洲视频| 国产精品老牛影院在线观看| 日产精品99久久久久久| 日韩网站在线观看| 久久免费视频网站| www.美女亚洲精品| 久久久久久高潮国产精品视| 亚洲欧美成人精品| 久久精品视频一| 亚洲精品小视频在线观看| 日韩av影院在线观看| 91久久夜色精品国产网站| 91精品国产综合久久香蕉的用户体验| 色哟哟网站入口亚洲精品| 国产精品视频内| 奇米成人av国产一区二区三区| 色偷偷偷亚洲综合网另类| 97在线视频免费| 亚洲视频第一页| 国产精品久久久久久久久久ktv| 国产精品视频色| 91禁外国网站| 久久久视频免费观看| 国产日韩在线看| 中文字幕欧美专区| 日韩中文字幕第一页| 中文欧美在线视频| 欧美性在线视频| 成人激情视频网| 欧美激情中文字幕在线| 性欧美亚洲xxxx乳在线观看| 国产精品美乳在线观看| 国产精品自产拍在线观看| 亚洲欧洲日产国产网站| 亚洲国产精品久久久久秋霞不卡| 久久久亚洲福利精品午夜| 91成人在线观看国产| 伊人伊人伊人久久| 尤物yw午夜国产精品视频明星| 国产精品自产拍在线观看| 色诱女教师一区二区三区| 北条麻妃99精品青青久久| 国产综合香蕉五月婷在线| 91免费国产视频| 性色av一区二区三区免费| 日韩成人在线视频| 成人黄色av播放免费| 成人a在线视频| 欧美第一页在线| 亚洲人永久免费| 亚洲色图25p| 国产精品成人免费电影| 91av在线播放| 欧美在线观看网址综合| 亚洲激情成人网| 国产精品久久久久久久久久尿| 亚洲的天堂在线中文字幕| 欧美一区在线直播| 国产成人aa精品一区在线播放| 国产精品偷伦一区二区| 在线精品视频视频中文字幕| 欧美壮男野外gaytube| 午夜剧场成人观在线视频免费观看| 97香蕉久久夜色精品国产| 成人有码在线视频| 伊人伊成久久人综合网小说| 久久综合九色九九| 欧美激情一区二区三级高清视频| 久久亚洲影音av资源网| 成人激情黄色网| 日韩高清免费观看| 一色桃子一区二区| 国产精品久久久91| 日韩中文在线中文网三级| 精品毛片三在线观看| 久久人人看视频| 亚洲图片欧美午夜| 2018中文字幕一区二区三区| 亚洲美女激情视频| 国产成人av在线播放| 成人xxxx视频| 97精品国产97久久久久久春色| 福利视频导航一区| 91最新国产视频| 亚洲精品www久久久久久广东| 2019亚洲男人天堂| 亚州精品天堂中文字幕| 欧美—级高清免费播放| 色婷婷亚洲mv天堂mv在影片| 亚洲国产天堂网精品网站| 欧美性色19p| 亚洲精品国产欧美| 亚洲精品久久久久国产| 国产成人黄色av| 欧美成人免费播放| 66m—66摸成人免费视频| 国产精品午夜一区二区欲梦| 亚洲精品国偷自产在线99热| 成人h猎奇视频网站| 亚洲影院在线看| 日韩成人在线观看| 国产一区私人高清影院| 国产精品美女免费| 欧美大学生性色视频| 国内精品视频在线| 一区二区日韩精品| 日韩av网站电影| 国产美女被下药99| 亚洲www永久成人夜色| 日韩女优人人人人射在线视频| 精品久久久久久中文字幕大豆网| 国产精品一香蕉国产线看观看| 国产午夜精品美女视频明星a级| 国产一区二区三区久久精品| 日韩免费在线观看视频| 亚洲精品视频播放| 国产91精品网站| 亚洲无av在线中文字幕| 国产精品久久久久一区二区| 成人av番号网| 激情亚洲一区二区三区四区| 欧美自拍视频在线观看| 91高清免费视频| 亚洲国产成人精品久久| 91久久久国产精品| 国内伊人久久久久久网站视频| 欧美午夜精品在线| 亚洲精品国产精品国产自| 91社区国产高清| 在线成人中文字幕| 美女黄色丝袜一区| 久久亚洲私人国产精品va| 色综合老司机第九色激情| 久久精品99久久香蕉国产色戒| 欧美日韩国产第一页| 国产精品视频一区国模私拍| 欧美一级大胆视频| 最近2019年好看中文字幕视频| 国产精品高清在线| 国产综合视频在线观看| 久久噜噜噜精品国产亚洲综合| 久久免费观看视频| 欧美一区二区大胆人体摄影专业网站| 亚洲日本成人女熟在线观看| 91精品国产高清自在线看超| 久久精品久久精品亚洲人|