一. 问题
最近项目遇到这样一个问题,如下图所示:
这里系统右滑返回上一级跟播放进度条拖动有冲突,当播放进度在最开始的时候,一拖动就立马返回上一级界面。因此再次记录下解决方法。
二. 解决方法
-
在
viewDidAppear
函数里设置返回上一级界面手势的代理,在viewDidDisappear
函数里面移除代理。- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; self.navigationController.interactivePopGestureRecognizer.delegate = self; } - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; self.navigationController.interactivePopGestureRecognizer.delegate = nil; }
然后在 代理 方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
里面判断,当前触摸的view是否为返回上一级手势的UILayoutContainerView
,如果是判断当前触摸点和进度条所在位置是否一致,如果一致返回NO
。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
// 首先判断otherGestureRecognizer是不是系统pop手势
if ([gestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
CGPoint point = [gestureRecognizer locationInView:gestureRecognizer.view];
CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
CGRect rect = [self.tableView convertRect:rectInTableView toView:self.view];
if ((point.y > rect.origin.y - 200) && (point.y < rect.origin.y - 100)) {
return NO;
}
return YES;
}
return YES;
}
这里因为进度条放在了tableView
的头部,因此需要先进行转换得到相对于viewController
的view
的位置,再进行判断。