一. 問題
最近項目遇到這樣一個問題,如下圖所示:
語音播放.png
這里系統右滑返回上一級跟播放進度條拖動有沖突,當播放進度在最開始的時候,一拖動就立馬返回上一級界面。因此再次記錄下解決方法。
二. 解決方法
-
在
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
的位置,再進行判斷。