执行两个手指滑动手势时,禁用集合视图默认平移手势

时间:2014-12-30 14:25:17

标签: ios iphone uicollectionview uigesturerecognizer uiswipegesturerecognizer

请帮我解决以下问题。

  • Self.view(此处添加了滑动手势)
  • 子视图中的UicollectionView对象(默认平移,滑动手势在那里)
  • 要禁用2次手指滑动事件的scrollview scrolling / failCollectionViewPan手势
  • 如果执行2次手指滑动,则意味着集合视图不会滚动

另一种方法可以是在使用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;

}

此外,我已经实现了以下两种方法来修复它但是失败了。

- (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不起作用。由于,colection视图的默认平移手势,它无法修改。虽然这样,应用程序崩溃了。

2 个答案:

答案 0 :(得分:0)

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

- (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,并且在此功能你只能禁用otherGestureRecoginzer ...

更新: 另一种解决方案:使用另一个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;
}

答案 1 :(得分:0)

这个答案可能太晚了,但是今天我确实遇到了类似的问题,直到我自己弄清楚一些东西后才找到解决方案。实际上,这很简单。

快速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或3个或更多手指滚动collectionView,但是2手指的平移手势被阻止。