MMDrawerController
做爲一個在Github上超過6k Star的熱門項目,估計很多朋友都有用過。ide
在MMDrawerController
的使用過程當中,不免遇到一下手勢衝突問題,這裏集中記錄一下本人的解決辦法。code
這個問題解決須要兩個步驟,首先,繼承MMDrawerController
寫一個子類,而後在子類中實現UIPanGesture的繼承
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
這個回調,以下it
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { UIPanGestureRecognizer* pan = (UIPanGestureRecognizer*)gestureRecognizer; CGPoint p = [pan translationInView:pan.view]; if(fabs(p.y)<fabs(p.x) && p.x > 0) { return NO; } return fabs(p.y)<fabs(p.x); } return YES; }
用if(fabs(p.y)<fabs(p.x) && p.x > 0)
判斷滑屏方向爲橫向向右時,return NO,禁止tableView上下滾動,若是去掉這段,則在向右打開過程當中同時tableView還能夠上下滑動。io
而後用fabs(p.y)<fabs(p.x)
判斷是否爲向左的水平滑動,我這裏只使用了左邊側滑菜單,因此向左劃時候,return YES,保證了tableView的cell編輯功能順利開啓。table
一樣的思路,在繼承MMDrawerController
的子類中添加以下代碼class
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) { if(self.openSide == MMDrawerSideNone) { return NO; } } return [super gestureRecognizer:gestureRecognizer shouldReceiveTouch:touch]; }
這裏解決的原理也很簡單,在邊欄爲關閉狀態的時候,禁止MMDrawerController
的pan手勢接受tap類型的touch。原理
這個問題換一個思路解決,在tableView開始編輯和中止編輯的回調中,調整MMDrawerController
的菜單開啓屬性。im
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath { self.mm_drawerController.openDrawerGestureModeMask = MMOpenDrawerGestureModeNone; } - (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { self.mm_drawerController.openDrawerGestureModeMask = MMOpenDrawerGestureModeAll; }
完美解決問題。項目
若有其餘問題歡迎留言討論。