首先在tableView里面實現cell的左滑刪除功能是挺簡單的,相信大家都懂得怎么做。但是,當有多個tableView放在一個scrollView里面的時候,會產生一系列的問題。
問題1:
? ? ? scrollView在滑倒最邊上(左或右)的時候,為了提醒用戶已經滑到最邊上了(左或右),再繼續向左(右)滾動的話會有一個反彈的效果,這就造成左滑刪除的時候,整個tableView會出現一個我們不想看到的反彈效果。
解決方法:
? ? 會出現這種效果,是因為蘋果為了讓用戶知道scrollView已經滑到了最邊上了,而不是程序卡了或者出現問題了而不能滑動。所以,scrollView對象里面有三個屬性,分別是bounces,bounceHorizontally與bounceVertically三個屬性,通過 self.scrollView.bounces = NO;這行代碼就可以讓scrollView滑倒邊上的時候不會出現反彈效果。
關鍵代碼:
self.scrollView.bounces = NO;
問題2:
? ? ? 當你把scrollView滑到最邊上(左或右)的時候,當你繼續做滑想要讓cell接收左滑手勢的時候,這時滑動刪除的事件被底部的UIScrollview給響應了,cell根本拿不到這個滑動手勢。tableView是UIScrollview 的子類,cell里面的ContentView好像在iOS7.0之后也是UIScrollview ,再加底部一個UIScrollview,這滑動手勢事件該怎么傳遞好呢,給誰都不行啊。 給了底部,那么就沒法滑動刪除,給了cell那么正常的左右滑動又不行了。
解決方法:
首先,新建一個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