【问题标题】:Make collection view default pan gesture disabled when two finger swipe gesture executed执行两指滑动手势时禁用集合视图默认平移手势
【发布时间】:2015-02-26 17:14:43
【问题描述】:

请帮我解决以下情况。

  • Self.view(此处添加了滑动手势)
  • 子视图中的 UicollectionView 对象(默认平移,滑动手势)
  • 想要禁用 2 指滑动事件的滚动视图滚动/failCollectionViewPan 手势
  • 表示如果执行 2 根手指滑动,集合视图将不会滚动

另一种方法是在使用 2 个手指时禁用集合视图滚动。在这里,我不想在两指滑动时滑动收藏视图。

我已经实现了这段代码,但它会减慢滚动速度。

[self.collectionView.panGestureRecognizer shouldBeRequiredToFailByGestureRecognizer:_swipeL];

然后我实现了下面的代码

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
     return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
     return YES;
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
     return YES;
}

现在,Swipe 和 Scroll 两者协同工作。

然后,我尝试了以下方式,但仍然没有解决。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{

if([gestureRecognizer isKindOfClass:[UISwipeGestureRecognizer class]]){
    if(gestureRecognizer.numberOfTouches==2){

        if( [[otherGestureRecognizer.view class] isSubclassOfClass:[UITableViewCell class]] ||
           [NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UITableViewCellScrollView"] ||
           [NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UITableViewWrapperView"] || [NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UIScrollViewPanGestureRecognizer"] || [NSStringFromClass([otherGestureRecognizer.view class]) isEqualToString:@"UIScrollViewPagingSwipeGestureRecognizer"])
        {
            NSLog(@"Allow&Disable %@", [otherGestureRecognizer description]);
            [gestureRecognizer requireGestureRecognizerToFail:otherGestureRecognizer];

            return NO;
        }
    }
}
return YES;

}

我还实现了以下 2 种方法来修复它但失败了。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);

它可以通过这种方式修复 ScrollView,但同样的方式不适用于 UICollectionView。因为,集合视图的默认平移手势,它无法修改。以这种方式尝试时,应用程序崩溃了。

【问题讨论】:

    标签: ios iphone uicollectionview uigesturerecognizer uiswipegesturerecognizer


    【解决方案1】:

    如果您想检测平移手势,请尝试这样的操作。但是你需要识别平移手势的方向:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGesture:)];
        panGesture.delegate = self;
        [self.yourCollectionView addGestureRecognizer:panGesture];
    }
    
    - (void)panGesture:(UIPanGestureRecognizer *)gesture;
    {
        if (gesture.numberOfTouches == 2) {
            NSLog(@"Two fingers pan gesture");
        }
    }
    
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]
                && gestureRecognizer.numberOfTouches == 2) {
            return NO;
        }
        return YES;
    }
    

    您对 UISwipeGestureRecognizer 的问题是,它比 UIPanGesture 触发晚,因此在 shouldRecognizeSimultaneouslyWithGestureRecognizer 委托调用中,滑动手势始终为 otherGestureRecognizer,而 UIPanGesture 始终为 gestureRecognizer,在此功能中您只能禁用 @ 987654325@...

    更新: 另一种解决方案:使用另一个 UIPanGestureRecognizer 禁用滚动平移手势:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        UISwipeGestureRecognizer *swipeGesture = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeGesture:)];
        swipeGesture.direction = UISwipeGestureRecognizerDirectionDown;
        swipeGesture.delegate = self;
        swipeGesture.numberOfTouchesRequired = 2;
    
        UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:nil];
        panGesture.delegate = self;
        [self.tableView addGestureRecognizer:panGesture];
        [self.tableView addGestureRecognizer:swipeGesture];
    }
    
    - (void)swipeGesture:(UIPanGestureRecognizer *)gesture;
    {
        NSLog(@"Two fingers swipe gesture");
    }
    
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
    {
        if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]
                && gestureRecognizer.numberOfTouches == 2) {
            return NO;
        }
    
        return YES;
    }
    

    【讨论】:

      【解决方案2】:

      这个答案可能会迟到,但我今天确实遇到了类似的问题并且找不到解决方案,直到我自己弄清楚了一些事情。其实很简单。

      斯威夫特 5

      我们创建一个手势

          let gesture = UIPanGestureRecognizer(target: self, action: #selector(functionCall))
          gesture.minimumNumberOfTouches = 2
          gesture.maximumNumberOfTouches = 2
      

      然后我们将该手势分配给 collectionView,从而有效地覆盖其上的滚动手势。

          collectionView.addGestureRecognizer(gesture) // simply overwrites the 2 finger gesture on the collectionView
      

      现在可以用 1、3 或更多手指滚动 collectionView,但 2 指平移手势被阻止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多