iOS 嵌套在scrollView裏面的tableView實現左滑刪除功能

首先在tableView裏面實現cell的左滑刪除功能是挺簡單的,相信你們都懂得怎麼作。可是,當有多個tableView放在一個scrollView裏面的時候,會產生一系列的問題。git


問題1:github

      scrollView在滑倒最邊上(左或右)的時候,爲了提醒用戶已經滑到最邊上了(左或右),再繼續向左(右)滾動的話會有一個反彈的效果,這就形成左滑刪除的時候,整個tableView會出現一個咱們不想看到的反彈效果。數組

解決方法:函數

    會出現這種效果,是由於蘋果爲了讓用戶知道scrollView已經滑到了最邊上了,而不是程序卡了或者出現問題了而不能滑動。因此,scrollView對象裏面有三個屬性,分別是bounces,bounceHorizontally與bounceVertically三個屬性,經過 self.scrollView.bounces = NO;這行代碼就可讓scrollView滑倒邊上的時候不會出現反彈效果。orm

關鍵代碼:對象

self.scrollView.bounces = NO;繼承

 

問題2:事件

      當你把scrollView滑到最邊上(左或右)的時候,當你繼續作滑想要讓cell接收左滑手勢的時候,這時滑動刪除的事件被底部的UIScrollview給響應了,cell根本拿不到這個滑動手勢。tableView是UIScrollview 的子類,cell裏面的ContentView好像在iOS7.0以後也是UIScrollview ,再加底部一個UIScrollview,這滑動手勢事件該怎麼傳遞好呢,給誰都不行啊。 給了底部,那麼就無法滑動刪除,給了cell那麼正常的左右滑動又不行了。ip

解決方法:get

首先,新建一個MyScrollView類,讓其繼承於UIScrollView,而且遵循UIGestureRecognizerDelegate協議。

@interface MyScrollview : UIScrollView <UIGestureRecognizerDelegate>

iOS的UIGestureRecognizer基類內包含 Tap(點擊)、Pinch(捏合)、Rotation(旋轉)、Swipe(滑動)、Pan(拖移)、LongPress(長按)這幾種經常使用手勢動做,又細分單擊、雙擊、左滑、右滑等操做。

而後重寫下類方法:

-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {

     if(gestureRecognizer.state != 0) {

     return YES;

}else {

     return NO;

}

重寫以後讓這個類綁定你界面中的scrollView.這個函數裏面的意思是若是一個手勢沒有被識別的話,那麼就讓多個gestureRecognizer能夠被識別,也就是本文的scrollView與tableView的cell的滑動手勢能夠同時被識別。

可是這樣以後,又會出現一個新的問題,也就是當scrollView在左右滑動的時候,tableView也能同時的上下滑動。形成這種現象的緣由是上面MyScrollView裏面重寫的函數形成了多個手勢同時被響應。解決這種問題的方法是在ViewController類裏面處理滾動時候的事件。

#pragma mark - ScrollView delegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

     if(scrollView == self.myScrollView) {

     self.tableView1.scrollEnabled = NO;

     self.tableView2.scrollEnabled = NO;

   } 

}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if(scrollView == self.myScrollView) {

      self.tableView1.scrollEnabled = YES;

      self.tableView2.scrollEnabled = YES;

  }

}

代碼的意思是當你在滑動scrollView的時候,把全部的tableView設置爲不可滑動,而當scrollView滑動結束的時候,再把tableView設置爲能夠滑動,這樣就能避免scrollView與tableView同時滑動了。

好了,到此爲止,爲嵌套在scrollView裏面的tableView實現滑動刪除的功能所遇到的問題已經解決了。注意,這裏解決的是給右邊的tableView增長滑動刪除,若是你的需求是給左邊的tableView增長滑動刪除,那麼解決方案是:拿起鍵盤砸向產品經理。

下面給出實現滑動刪除經常使用到的方法。

-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {

   return @"刪除";

}

該方法返回的是你左滑時候出現的文字提示。

 

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {

  return UITableViewCellEditingStyleDelete;

}

該方法是根據indexPath返回tableView裏面每一行的編輯類型。包括UITableViewCellEditingStyleDelete,UITableViewCellEditingStyleNone與UITableViewCellEditingStyleInsert.

 

-(NSArray*)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {

     UITableViewRowAction* deleteAction = [UITableViewRowAction       rowActionWithStyle:UITableViewRowActionStyleNormal title:@"刪除"  handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {

這裏面寫點擊按鈕的所響應的事件。

}];

 return @[deleteAction];

}

這個函數能夠建立多個action,並以數組的形勢返回,使得左滑時候可以出現多個按鈕。

 

還有commitEditingStyle等等的函數,這裏就不一一例舉了。這裏附上本身的gitHub地址:github.com/juncheng785245941

做者:長髮飄飄陳序員連接:http://www.jianshu.com/p/c2662907d4c4來源:簡書著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。
相關文章
相關標籤/搜索