当执行两指轻扫手势时,将使集合视图默认为平移手势

问题描述 投票:1回答:2

请在以下情况下帮助我。

  • [Self.view(在此处添加了滑动手势)
  • subView中的UicollectionView对象(默认为平移,有滑动手势)
  • 想要为两指滑动事件禁用scrollview滚动/ failCollectionViewPan手势
  • 如果执行了两指滑动,均值收集视图将不会滚动

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

现在,滑动和滚动都可以一起使用。

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

- (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。由于集合视图的默认平移手势,因此无法对其进行修改。以这种方式尝试时,应用崩溃了。

ios iphone uicollectionview uigesturerecognizer uiswipegesturerecognizer
2个回答
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,在此功能中,您只能禁用[C0 ] ...

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

otherGestureRecoginzer

0
投票

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

Swift 5

我们创建手势

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.