解決右滑返回手勢和UIScrollView中的手勢衝突,手勢uiscrollview

來源:互聯網
上載者:User

解決右滑返回手勢和UIScrollView中的手勢衝突,手勢uiscrollview

項目中遇到一個頁面中是以一個scrollview橫向Tab展示兩個不同功能的顯示,譬如訊息和公告功能,但是由於滑動返回手勢和scrollview的滑動返回手勢衝突了,導致頁面不再能夠滑動返回。類似的還有圖片瀏覽功能也出現過。

iOS系統中,滑動返回手勢,其實是一個UIPanGestureRecognizer,系統預設的操作是只有滑動螢幕的左邊的某個位置,UIPanGestureRecognizer才會起作用。UIScrollView的滑動手勢也是UIPanGestureRecognizer。那在側邊滑動時,讓UIScrollView的不響應事件就OK了嘛,首先想到了繼承UIScrollView 重寫下面的方法,讓滑動側邊時scrollView不響應事件,根據響應者鏈,事件最終會傳遞給下方的滑動手勢。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event     {      if (point.x < location.x) { // location.x為系統的某個點的x          return nil;      } else {          return [super hitTest:point withEvent:event];      }}

但是,這樣有個問題,就是在一個頁面不同tab時,也需要滑動切換,滑動返回。

由於scrollView的滑動手勢攔截了事件,那我重寫scrollView中panGestureRecognizer的代理方法,讓它不攔截就好了嘛。於是繼承UIScrollView,重寫下面的方法。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {        if ([self panBack:gestureRecognizer]) {             return YES;        }        return NO; }- (BOOL)panBack:(UIGestureRecognizer *)gestureRecognizer {    if (gestureRecognizer == self.panGestureRecognizer) {          UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;          CGPoint point = [pan translationInView:self];          UIGestureRecognizerState state = gestureRecognizer.state;          if (UIGestureRecognizerStateBegan == state || UIGestureRecognizerStatePossible == state) {              CGPoint location = [gestureRecognizer locationInView:self];              if (point.x > 0 && location.x < “這個自己設定" && self.contentOffset.x <= 0) {                   return YES;              }          }     }     return NO;}

需要側邊滑動時 panBack 返回YES,這時候,我讓scrollView的手勢和頁面的滑動返回手勢共存,scrollView不攔截手勢,那不就可以滑動返回了嗎。好了,測試一下,可以滑動返回,但是滑動返回時,為什麼scrollView也跟著在滑動呢,太影響美觀了,看來還需要另外的辦法,我又回到了第一種辦法時的想法,讓scrollView切換的時候相應panGesture,滑動返回的時候不響應,那重寫scrollView中的另外一個panGestureRecognizer的代理方法。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {    if ([self panBack:gestureRecognizer]) {        return NO;    }    return YES;}

第二種方法:

 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer   {       // 首先判斷otherGestureRecognizer是不是系統pop手勢       if ([otherGestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {           // 再判斷系統手勢的state是began還是fail,同時判斷scrollView的位置是不是正好在最左邊           if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan && self.contentOffset.x == 0) {                return YES;           }       }       return NO;  }

以上的代碼都是在一個自訂的UIScrollView上的,重寫上面的方法即可。然後讓橫向滾動的scrollView繼承這個自訂UIScrollView就OK了。

原理:
scrollView的pan手勢會讓系統的pan手勢失效,所以我們只需要在系統手勢失效且scrollView的位置在初始位置的時候讓兩個手勢同時啟用就可以了

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.