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