一. 問(wèn)題
最近項(xiàng)目遇到這樣一個(gè)問(wèn)題易核,如下圖所示:
語(yǔ)音播放.png
這里系統(tǒng)右滑返回上一級(jí)跟播放進(jìn)度條拖動(dòng)有沖突嗅蔬,當(dāng)播放進(jìn)度在最開(kāi)始的時(shí)候蜘渣,一拖動(dòng)就立馬返回上一級(jí)界面。因此再次記錄下解決方法杰刽。
二. 解決方法
-
在
viewDidAppear
函數(shù)里設(shè)置返回上一級(jí)界面手勢(shì)的代理菠发,在viewDidDisappear
函數(shù)里面移除代理王滤。- (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
里面判斷,當(dāng)前觸摸的view是否為返回上一級(jí)手勢(shì)的UILayoutContainerView
滓鸠,如果是判斷當(dāng)前觸摸點(diǎn)和進(jìn)度條所在位置是否一致雁乡,如果一致返回NO
。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
// 首先判斷otherGestureRecognizer是不是系統(tǒng)pop手勢(shì)
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;
}
這里因?yàn)檫M(jìn)度條放在了tableView
的頭部糜俗,因此需要先進(jìn)行轉(zhuǎn)換得到相對(duì)于viewController
的view
的位置蔗怠,再進(jìn)行判斷。