国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

右滑返回手勢和UIScrollView中手勢沖突的解決方法

2019-10-21 18:48:13
字體:
來源:轉載
供稿:網友

項目中遇到一個頁面中是以一個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的位置在初始位置的時候讓兩個手勢同時啟用就可以了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三门县| 阿巴嘎旗| 浦北县| 博客| 灌南县| 新津县| 会理县| 丹江口市| 吴江市| 于田县| 临桂县| 浦县| 南溪县| 秦皇岛市| 阳山县| 类乌齐县| 长宁县| 安义县| 弥渡县| 恩平市| 云霄县| 新乐市| 喜德县| 板桥市| 宜昌市| 大悟县| 库尔勒市| 佛冈县| 宁强县| 门头沟区| 龙岩市| 龙泉市| 宣城市| 蓬莱市| 襄城县| 开封市| 靖边县| 临邑县| 麟游县| 涟水县| 湖州市|