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