简体   繁体   中英

Make collection view default pan gesture disabled when two finger swipe gesture executed

Please help me with the below scenario.

  • Self.view (Swipe Gesture added here)
  • UicollectionView Object in subView (Default pan,swipe gestures are there)
  • Want to disable scrollview scrolling/failCollectionViewPan gesture for 2 finger swipe event
  • Means collection view will not scroll if 2 finger swipe executed

Another approach can be to disable Collection view scrolling while 2 fingers used. Over here, I want not to swipe collection view on 2 finger swipe.

I have implemented this code, but its slowing down scrolling.

[self.collectionView.panGestureRecognizer shouldBeRequiredToFailByGestureRecognizer:_swipeL];

Then I have implemented below codes

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

Now both, Swipe and Scroll are working together.

Then, I have tried in a below manner, but still not got fixed.

- (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;

}

Also I have implemented below 2 methods to fix it but fails.

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

Its is able to fix for ScrollView with such ways, but the same ways are not working for UICollectionView. Because of, colection view's default pan gesture, it cannot be able to modified. While tring this way, app crashed.

If you want to detect pan gesture, try something like this. But you need to recognise direction of pan gesture:

- (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;
}

Your problem with UISwipeGestureRecognizer is, that it fires later than UIPanGesture, so in the shouldRecognizeSimultaneouslyWithGestureRecognizer delegate call, swipe gesture is always otherGestureRecognizer , and UIPanGesture is always gestureRecognizer , and in this function you can only disable otherGestureRecoginzer ...

UPDATE: Another solution: use another UIPanGestureRecognizer to disable scroll pan gesture:

- (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;
}

This answer might be late, but I did have a similar problem today and couldn't find a solution, until I figured something out myself. It's quite simple, actually.

Swift 5

We create a gesture

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

We then assign that gesture to the collectionView, effectively overwriting the scroll gesture on it.

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

It now is possible to scroll the collectionView with 1, 3 or more fingers, but the 2 finger pan gesture is blocked.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM