gpt4 book ai didi

右滑返回手势和UIScrollView中手势冲突的解决方法

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章右滑返回手势和UIScrollView中手势冲突的解决方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

项目中遇到一个页面中是以一个scrollview横向Tab展示两个不同功能的显示,譬如消息和公告功能,但是由于滑动返回手势和scrollview的滑动返回手势冲突了,导致页面不再能够滑动返回。类似的还有图片浏览功能也出现过.

iOS系统中,滑动返回手势,其实是一个UIPanGestureRecognizer,系统默认的操作是只有滑动屏幕的左边的某个位置,UIPanGestureRecognizer才会起作用。UIScrollView的滑动手势也是UIPanGestureRecognizer。那在侧边滑动时,让UIScrollView的不响应事件就OK了嘛,首先想到了继承UIScrollView 重写下面的方法,让滑动侧边时scrollView不响应事件,根据响应者链,事件最终会传递给下方的滑动手势.

?
1
2
3
4
5
6
7
- (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,重写下面的方法.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
- ( 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的代理方法.

?
1
2
3
4
5
6
7
8
- ( BOOL )gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
 
   if ([self panBack:gestureRecognizer]) {
     return NO;
   }
   return YES;
 
}

第二种方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
-( 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的位置在初始位置的时候让两个手势同时启用就可以了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

最后此篇关于右滑返回手势和UIScrollView中手势冲突的解决方法的文章就讲到这里了,如果你想了解更多关于右滑返回手势和UIScrollView中手势冲突的解决方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com