近來項目中需要用到側滑菜單,測試了一下REFrostedViewController還能滿足需求,本著不重復造輪子的原則,決定使用求冷。
根據(jù)作者:romaonthego提供的Demo玩起來比較嗨,一看就明白窍霞,于是乎我也搞了個UINavigationController
加入UIPanGestureRecognizer
手勢來實時移動菜單匠题,所有的視圖控制器都在這個UINavigationController
的管理下健康成長。
直到我接到一個需求是表格側滑刪除(也就是Cell的側滑刪除)官撼,心想這特么多簡單回事梧躺,看著這需求,還偷著樂,Android那逼蛋疼了(聽說是不好整掠哥,具體我也不知道)巩踏,直接用系統(tǒng)提供的代理三下五除二搞定,那就在這時準備絲滑一下的時候续搀,采坑了塞琼。
側滑刪除干死也不響應,善于思考的我淡然是使用排除法禁舷,心想UITableView都特么用了多少年了彪杉,還能用錯了?還是各種檢查牵咙,發(fā)現(xiàn)沒問題派近,無奈還去看了以前的代碼,都是妥妥的洁桌,用法絕對沒錯:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleDelete;
}
那現(xiàn)在就懷疑是不是踩到iOS9的坑了渴丸,查閱了各種資料和發(fā)現(xiàn)也不是這么回事,迫于無奈還是有點懷疑自己另凌,決定新建個空的工程單獨寫側滑刪除Demo試試谱轨,秒秒鐘搞定運行,妥妥的吠谢,非常絲滑土童。最后只能檢查自己代碼了(程序狗出問題了最喜歡先懷疑別人)。
經過一番各種檢查工坊,絕逼全都是對的寫法献汗,哥怎么肯能出錯呢,回望也沒在晚上發(fā)現(xiàn)下午的代碼是一坨坨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
側滑刪除的坑茬腿,其他的有小伙伴遇到在一起解決吧。