欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解

前言

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)與策劃設(shè)計(jì),肥鄉(xiāng)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:肥鄉(xiāng)等地區(qū)。肥鄉(xiāng)做網(wǎng)站價(jià)格咨詢:18982081108

在我們的app開發(fā)當(dāng)中,經(jīng)常會(huì)用到UITableView 的左滑刪除的功能,通常的話效果如下

iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解

但有時(shí)候系統(tǒng)現(xiàn)有的功能并不能完全滿足我們的開發(fā)需求,這樣就需要我們?cè)谄洮F(xiàn)有的功能基礎(chǔ)上自定義我們所需要的功能了。下圖是在項(xiàng)目中自定義的按鈕(只是修改了按鈕的frame而已)。

iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解

然后我就總結(jié)了一下根據(jù)不同的需求自定義不同的按鈕。

一、系統(tǒng)默認(rèn)左滑刪除按鈕

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

//使用系統(tǒng)默認(rèn)的刪除按鈕
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
 if (editingStyle == UITableViewCellEditingStyleDelete){

 }
}
//自定義系統(tǒng)默認(rèn)的刪除按鈕文字
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
 return @"自定義按鈕”;
}

效果如下所示:

iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解
系統(tǒng)自帶

雖然這樣能基本實(shí)現(xiàn)功能,但是我們發(fā)現(xiàn)右邊的按鈕和左邊的黃色區(qū)域的高度并不一樣。這是因?yàn)橛疫叞粹o是和UITableViewCell的高度一致,而左邊的黃色區(qū)域只是一張圖片而已,其高度設(shè)置和UITableViewCell的高度并不一致,才會(huì)導(dǎo)致這樣的布局出現(xiàn)。如果我們想要?jiǎng)h除按鈕和左邊圖片一樣的高度,那我們就需要自定義刪除按鈕的高度了。

二、自定義左滑刪除按鈕

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

//自定義多個(gè)左滑菜單選項(xiàng)
- (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];
}

在上述代理方法中我們就可以實(shí)現(xiàn)在cell中添加一個(gè)或多個(gè)左滑按鈕了,根據(jù)點(diǎn)擊不同的按鈕實(shí)現(xiàn)不同的響應(yīng)方法便可。其中[tableView setEditing:NO animated:YES];方法可以在點(diǎn)擊按鈕之后退出編輯模式并隱藏左滑菜單。但如果我們想要修改按鈕的其他屬性如標(biāo)題、背景顏色怎么辦?點(diǎn)擊進(jìn)入U(xiǎn)ITableViewRowAction類中,我們會(huì)發(fā)現(xiàn)以下屬性和方法:

@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;是指設(shè)置所添加按鈕父視圖的背景顏色以及按鈕字體顏色:

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

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

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

iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解

左iOS10/右iOS11(Xcode9中)

從對(duì)比圖中可以看出:

(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的子視圖。

由于不同系統(tǒng)下的視圖層次不一樣,因此我們?cè)陧?xiàng)目中需要根據(jù)不同的代碼去同時(shí)適配iOS8-10和iOS11。
在iOS8-10中( 以下均在Xcode 9中編譯):

在該系統(tǒng)下由于我們所需自定義的按鈕視圖UITableViewCellDeleteConfirmationView是UITableViewCell的子視圖,所以我們?cè)谧远xUITableViewCell子類中遍歷它的subviews即可。代碼如下:

- (void)layoutSubviews {
 /**自定義設(shè)置iOS8-10系統(tǒng)下的左滑刪除按鈕大小*/
 for (UIView * subView in self.subviews) {
 if ([subView isKindOfClass:NSClassFromString(@"UITableViewCellDeleteConfirmationView")]) {
  subView.backgroundColor = [UIColor clearColor];//去掉默認(rèn)紅色背景
  //設(shè)置按鈕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) {//表示有一個(gè)按鈕
  UIButton * deleteButton = subView.subviews[0];
  deleteButton.titleLabel.font = [UIFont systemFontOfSize:20];
  }
  //自定義按鈕的圖片
  if (subView.subviews.count == 1 && self.indexPath.section == 1) {//表示有一個(gè)按鈕
  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) {//表示有兩個(gè)按鈕
  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中:

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

/**自定義設(shè)置iOS11系統(tǒng)下的左滑刪除按鈕大小*/
//開始編輯左滑刪除
- (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];//如果自定義只有一個(gè)按鈕就要去掉按鈕默認(rèn)紅色背景
    //設(shè)置按鈕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) {//表示有一個(gè)按鈕
     UIButton * deleteButton = subView.subviews[0];
     deleteButton.titleLabel.font = [UIFont systemFontOfSize:20];
    }
    //自定義按鈕的圖片
    if (subView.subviews.count == 1 && section == 1) {//表示有一個(gè)按鈕
     UIButton * deleteButton = subView.subviews[0];
     [deleteButton setImage:[UIImage imageNamed:@"login_btn_message"] forState:UIControlStateNormal];;
    }
    //自定義按鈕的文字圖片
    if (subView.subviews.count >= 2 && section == 0) {//表示有兩個(gè)按鈕
     UIButton * deleteButton = subView.subviews[1];
     UIButton * shareButton = subView.subviews[0];
     [self setUpDeleteButton:deleteButton];
     [self setUpShareButton:shareButton];
    }
   }
  }
 }
}

如果我們想在左滑刪除結(jié)束后實(shí)現(xiàn)一些功能,我們可以在UITableView中實(shí)現(xiàn)以下代理方法:

//結(jié)束編輯左滑刪除
- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath {

}
如果我們想分別設(shè)置UITableViewCell是否需要實(shí)現(xiàn)左滑功能,可以在下面代理方法中實(shí)現(xiàn):

//判斷是否顯示左滑刪除
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
 return YES;
}

在不同系統(tǒng)下分別添加以上代碼即可實(shí)現(xiàn)我們所需要的自定義左滑刪除按鈕,效果圖如下:

iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解

以上是我總結(jié)整理的在不同系統(tǒng)下的自定義UITableView左滑刪除功能。

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

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)創(chuàng)新互聯(lián)的支持。

網(wǎng)站題目:iOS自定義UITableView實(shí)現(xiàn)不同系統(tǒng)下的左滑刪除功能詳解
瀏覽路徑:http://aaarwkj.com/article2/isjcoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、微信公眾號(hào)、網(wǎng)頁(yè)設(shè)計(jì)公司面包屑導(dǎo)航、商城網(wǎng)站、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
九色综合狠狠综合久久| 欧美日韩一级一区二区三区| 国产欧美激情一区二区 | 日本一区二区三区免费不卡视频| 亚洲国产精品综合色在线| 欧美精品一区二区亚洲| 日韩精品在线观看大全套| 自拍一区日韩二区欧美三区 | 十八禁在线观看国产一区| 美女露脸口爆吞精视频| 亚洲国产专区一区二区麻豆| 久久国产亚洲欧美日韩精品| 中文字幕亚洲精品99| 男女性生活视频成年人观看| 国产精品线路一线路三| 粉嫩极品国产在线观看| 亚洲清纯唯美激情四射| 婷婷色精品一区二区激情| 日韩高清av不卡一区二区三区| 黑丝美女国产精品久久久| 欧美日韩精品视频专区| 日韩精品一二三区乱码| 高清高潮少妇一区二区三区| 亚洲日本乱码一区二区三| 无码精品人妻一区二区三区中| 中文字幕av在线日韩| 97资源在线公开视频| 一级欧美黄片在线播放| 亚洲国产成人久久综合区 | 亚洲av一区二区三区网站| 国产传媒在线观看精品| 99精品国产综合久久麻豆| 国产精精精精品欧美日韩| 蜜桃av在线播放视频| 国产传媒在线播放一区| 久久三级中文欧大战字幕| 麻豆人妻少妇精品系列| 久久视热频这里只有精品| 欧美熟妇在线视频你懂的| 无人区乱码一区二区三区| 亚洲欧美一区二区国产|