iOS開發之解決MMDrawerController側滑選單與中心檢視手勢衝突

maskmale發表於2018-06-17

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);
}


相關文章