MMDrawerController是一个很好用的实现抽屉效果的第三方类,但有时候当我们在中心视图的子视图控制器中需要使用手势进行其他操作的时候会产生手势冲突,导致运行效果不符合我们的想象。那么问题来了,该怎么解决冲突问题呢?
下面是我在使用过程中的个人总结:
我的需求:
1、只有左抽屉和中心视图控制器,在中心视图的子视图控制器右滑可以打开左抽屉。
2、中心视图的子视图控制器中的TableViewCell可通过滑动手势删除
问题所在:
1、由于删除cell的左滑手势和MMDrawerController的打开右抽屉的左滑手势有冲突(虽然我没有设置右抽屉),导致左滑删除cell的方法(当然是系统方法)时而响应时而不响应。
期待效果:
1、解除删除cell的手势冲突
2、右滑可以打开左抽屉
解决过程:基于上述问题网络上大部分的解决方案就是找到MMDrawerController.m中1460行
-(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) &&
[selfisPointContainedWithinNavigationRect:point] ==NO);
}虽然这个方案确实解决了手势冲突的问题,那么同时问题又来了,我发现侧边栏展开后点击中心视图可以关闭侧边栏的效果没了(虽然我感觉要不要都没啥大问题,但是PM非要我加上)
我的解决方法是定义一个全局变量动态改变centerViewContentRect的宽度,让它左划时为50,右划时为屏幕的宽度,那么就可以解决这个问题了,怎么判断左划右划请定位到1363行
-(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer shouldReceiveTouch:(UITouch*)touch{
if(self.openSide) {//右划
_LXWidth=self.centerContainerView.frame.size.width;
}else{
_LXWidth=50;
}}
水平有限只能想到这个笨方法,希望遇到同样问题的亲们参考一下就行了