REFrostedViewController與UITableViewCell側滑刪除的坑
來自: http://www.rockerhx.com/2015/10/27/2015-10-27-REFrostedViewController-UITableViewCell-Swipe-Delete/
近來項目中需要用到側滑菜單,測試了一下 REFrostedViewController 還能滿足需求,本著不重復造輪子的原則,決定使用。
根據作者: romaonthego 提供的Demo玩起來比較嗨,一看就明白,于是乎我也搞了個 UINavigationController 加入 UIPanGestureRecognizer 手勢來實時移動菜單,所有的視圖控制器都在這個 UINavigationController 的管理下健康成長。
直到我接到一個需求是表格側滑刪除(也就是Cell的側滑刪除),心想這特么多簡單回事,看著這需求,還偷著樂,Android那逼蛋疼了(聽說是不好整,具體我也不知道),直接用系統提供的代理三下五除二搞定,那就在這時準備絲滑一下的時候,采坑了。
側滑刪除干死也不響應,善于思考的我淡然是使用排除法,心想UITableView都特么用了多少年了,還能用錯了?還是各種檢查,發現沒問題,無奈還去看了以前的代碼,都是妥妥的,用法絕對沒錯:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { return YES; }
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleDelete; }
那現在就懷疑是不是踩到iOS9的坑了,查閱了各種資料和發現也不是這么回事,迫于無奈還是有點懷疑自己,決定新建個空的工程單獨寫側滑刪除Demo試試,秒秒鐘搞定運行,妥妥的,非常絲滑。最后只能檢查自己代碼了(程序狗出問題了最喜歡先懷疑別人)。
經過一番各種檢查,絕逼全都是對的寫法,哥怎么肯能出錯呢,回望也沒在晚上發現下午的代碼是一坨坨Shit嘛(PS:看來進步速度太慢了)。最后經過暴力測試,偶爾能在 Cell 上拉出側滑刪除,這一下就上升到手勢問題上了,決定從手勢開始排查。
果不其然就是自己在 UINavigationController 加的 UIPanGestureRecognizer 這筆影響了側滑刪除手勢。兩個手勢沖突了咋整,直接干啊,還能說啥。。。
吐槽了一大堆,進入正題,其實也沒啥好說的,就是使用 UIGestureRecognizerDelegate 的方法解決手勢同時存在的問題。
直接上代碼:
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureRecognized:)]; panGesture.delegate = self; [self.view addGestureRecognizer:panGesture];
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([[otherGestureRecognizer.view class] isSubclassOfClass:[UITableView class]]) { return NO; } if( [[otherGestureRecognizer.view class] isSubclassOfClass:[UITableViewCell class]] || [NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UITableViewCellScrollView"] || [NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UITableViewWrapperView"]) { return YES; } return YES; }
解決問題的思路和關鍵方法就在 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: 方法里,我們在捕獲到UITableView上的手勢的時候就不允許手勢的同時存在,在捕獲到Cell上的手勢時,這樣才能側滑刪除,而其他情況下不需要處理,直接返回 YES 以便讓 REFrostedViewController 處理手勢滑動彈出側滑菜單。
好了,這里僅填了 REFrostedViewController 和 UITableViewCell 側滑刪除的坑,其他的有小伙伴遇到在一起解決吧。