最近在做項(xiàng)目的就遇到了這個(gè)問題,UIScrollView橫向滑動(dòng)和返回手勢(shì)沖突.要想知道怎么解決問題,我們最好先要知道為什么會(huì)有這樣的問題.普及一下知識(shí):iOS系統(tǒng)中盈厘,滑動(dòng)返回手勢(shì),其實(shí)是一個(gè)UIPanGestureRecognizer,系統(tǒng)默認(rèn)的操作是只有滑動(dòng)屏幕的左邊的某個(gè)位置涡拘,UIPanGestureRecognizer才會(huì)起作用。UIScrollView的滑動(dòng)手勢(shì)也是UIPanGestureRecognizer界弧。UIGestureRecognizer和UIView是多對(duì)一的關(guān)系,UIGestureRecognizer一定要和view進(jìn)行綁定才能發(fā)揮作用愈魏。因此不難想象,UIGestureRecognizer對(duì)于屏幕上的手勢(shì)事件掰伸,其接收順序和UIView的層次結(jié)構(gòu)是一致的
UINavigationController.view —> UIViewController.view —> UIScrollView —> Screen and User's finger
即UIScrollView的panGestureRecognizer先接收到了手勢(shì)事件皱炉,直接就地處理而沒有往下傳遞。
實(shí)際上這就是兩個(gè)panGestureRecognizer共存的問題狮鸭。
好了,知道了問題,相信它也就沒那么難解決了~~~
方式1
查到的資料中這用方法使用的次數(shù)是最多的,而且也是最簡(jiǎn)單的,應(yīng)該是為不少人解決了這個(gè)沖突的難題,但是不知道為什么用到我的項(xiàng)目是是沒有用的,因此我才找了不知一種方法.代碼如下
[_ZJJLScrollView.panGestureRecognizer requireGestureRecognizerToFail:self.navigationController.interactivePopGestureRecognizer];
其實(shí)這個(gè)方法不止是適用于scrollView返回沖突,而且也同樣適用于tableView,因?yàn)楸硪晥D是繼承自滾動(dòng)視圖的.
方式2
1.首先自定義一個(gè)scrollView合搅,比如:CustomScrollView,遵守<UIGestureRecognizerDelegate>協(xié)議歧蕉,然后在實(shí)現(xiàn)文件中寫如下代碼:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
// 首先判斷otherGestureRecognizer是不是系統(tǒng)pop手勢(shì)
if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
// 再判斷系統(tǒng)手勢(shì)的state是began還是fail灾部,同時(shí)判斷scrollView的位置是不是正好在最左邊
if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {
return YES;
}
}
return NO;
}
2.那個(gè)橫向滾動(dòng)的scrollView繼承這個(gè)自定義scrollView,也就是CustomScrollView
原理:scrollView的pan手勢(shì)會(huì)讓系統(tǒng)的pan手勢(shì)失效惯退,所以我們只需要在系統(tǒng)手勢(shì)失效且scrollView的位置在初始位置的時(shí)候讓兩個(gè)手勢(shì)同時(shí)啟用就可以了
寫的這里,上述問題就已經(jīng)解決了,但是在這里我又聯(lián)想到了之前遇到的一個(gè)已經(jīng)解決的問題,當(dāng)整個(gè)界面鋪滿了webView的時(shí)候,有時(shí)候也會(huì)出現(xiàn)無(wú)法返回的問題,該怎么解決呢?來(lái),看代碼:
// 允許多個(gè)手勢(shì)并發(fā)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
在控制器敲上上述的方法就可以了,是不是很簡(jiǎn)單?