问题描述:window的根控制器上添加了UITableView,还有侧边栏视图,起初为了实现拖动完成侧边栏显示/不显示的效果,在根控制器视图上也添加了UIPanGestureRecognizer
平移手势。在进行UITableView的cell编辑(移动操作时),起先在设置tableView :[self.tableView setEditing:YES animated:YES];为编辑状态并进行移动操作,并不会与UIPanGestureRecognizer手势冲突,但是cell有点击选中didSelectRowAtIndexPath,并[self presentViewController:newVC animated:YES completion:nil];present模态弹出新控制器操作,等完成操作dismiss返回时,再去移动cell操作时,则会出现手势冲突并导致有侧边栏出现的问题(侧边栏是通过平移手势实现)。
疑点:1、为什么是进行了present操作之后才有的手势冲突?
2、手势冲突的本质原因怎么解决?
找了网上很多解决手势冲突的办法均不奏效,例如:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
if (gestureRecognizer == _panGesture) {
if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
return NO;
}
}
return YES;
}
又例如在present之前关闭tableView编辑状态,dismiss之后再进入编辑状态;又例如在手势action方法中做文章;有例如禁用/打开手势等等......
最后转换思路:通过在进入编辑状态之后,移除添加的UIPanGestureRecognizer手势:[self.view removeGestureRecognizer:_panGesture]; 等完成编辑,再添加平移手势[self.view addGestureRecognizer:_panGesture];
虽然这解决了我的问题,但究其冲突本质,并未解决,对于疑点1、2,欢迎交流,拜谢赐教~~~