MMDrawerController 是一個很好用的實作抽屜效果的第三方類,但有時候當我們在中心視圖的子視圖控制器中需要使用手勢進行其他操作的時候會産生手勢沖突,導緻運作效果不符合我們的想象。那麼問題來了,該怎麼解決沖突問題呢?
下面是我在使用過程中的個人總結:
需求:
1、隻有左抽屜和中心視圖控制器,在中心視圖的子視圖控制器右滑可以打開左抽屜。
2、中心視圖的子視圖控制器中的 Cell 可通過滑動手勢顯示自定義 Cell 中的删除按鈕
問題:
1、由于删除 Cell 的左滑手勢和 MMDrawerController 的打開右抽屜的左滑手勢有沖突,導緻左滑顯示自定義 Cell 删除按鈕的方法不響應。
期待效果:
1、解除删除 Cell 的手勢沖突
2、右滑可以打開左抽屜
思考過程:
MMDrawerController 中應該有一個識别手勢的方法,隻要找到這個方法問題就可以得到解決。
解決過程:
1、在 MMDrawerController 檔案夾下的各個
.m
檔案中通過 Command+F 搜尋 GestureRecognizer,最終在 MMDrawerController 這個類中找到這個方法
-(MMOpenDrawerGestureMode)possibleOpenGestureModesForGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer withTouch:(UITouch*)touch;
2、在這個方法中找到了
PointContainedWithinCenterViewContentRect:
這個判斷條件,按住 Command 點選後跳到它所在的位置,在這裡找到了問題所在。解決方式如下:
MMDrawerController.m 1443 行
-(BOOL)isPointContainedWithinCenterViewContentRect:(CGPoint)point{
// CGRect centerViewContentRect = self.centerContainerView.frame;
// 原文意思是把觸發抽屜的手勢識别放在整個螢幕中
CGRect centerViewContentRect = CGRectMake(0, 0, 50, self.centerContainerView.frame.size.height);
// 修改後的意思是把觸發打開抽屜手勢識别放在螢幕左側寬50,高為螢幕高度的 rect 中
centerViewContentRect = CGRectIntersection(centerViewContentRect,self.childControllerContainerView.bounds);
return (CGRectContainsPoint(centerViewContentRect, point) && [self isPointContainedWithinNavigationRect:point] == NO);
}