【问题标题】:GestureRecognizers not receiving touch events while UIScrollView is deceleratingUIScrollView 减速时 GestureRecognizers 未接收到触摸事件
【发布时间】:2014-08-14 03:39:27
【问题描述】:

我有一个水平滚动的 UICollectionView,其中填充了垂直滚动的 UITableView(两者都是 UISCrollView 的子类)。当滚动手势开始向任一方向滚动时,在其减速完成之前不会识别其他手势识别器。

所以如果我从一个tableView水平滚动到下一个,然后尝试在减速完成之前垂直滚动tableview,它将继续水平滚动。这很令人沮丧。

【问题讨论】:

    标签: uiscrollview uiscrollviewdelegate


    【解决方案1】:

    您可以通过实现 UIGestureRecognizerDelegate 方法让两个手势识别器同时工作:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        return YES;
    }
    

    但是,由于 UIScrollView 的内置手势识别器的委托必须是 UIScrollView 本身,因此您必须继承 UIScrollView(或 UITableView 或 UICollectionView)来实现此委托方法。

    有点违背委托的目的。

    无论如何,既然两个 UIScrollViews 都在同时识别手势,我们需要一种方法来区分水平和垂直滚动手势,并确保适当的滚动视图处理适当的手势。

    一个快速的解决方案是创建一个垂直滑动手势识别器,并要求它无法识别水平集合视图的内置手势识别器。

    UISwipeGestureRecognizer* verticalSwipe = [[UISwipeGestureRecognizer alloc] init];
    verticalSwipe.direction = UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp;
    verticalSwipe.delegate = self;
    for (UIGestureRecognizer *gesture in self.collectionView.gestureRecognizers){
        [gesture requireGestureRecognizerToFail:verticalSwipe];
    }
    [self.collectionView addGestureRecognizer:verticalSwipe];
    

    然后对垂直 tableView 执行相同的操作,添加一个水平滑动手势并要求该手势失败,以便 tableView 的内置识别器启动。

        UISwipeGestureRecognizer* horizontalSwipe = [[UISwipeGestureRecognizer alloc] init];
        horizontalSwipe.direction = UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight;
        horizontalSwipe.delegate = self;
        for (UIGestureRecognizer *gesture in tableView.gestureRecognizers){
            [gesture requireGestureRecognizerToFail:horizontalSwipe];
        }
        [tableView addGestureRecognizer:horizontalSwipe];
    

    添加:

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        return YES;
    }
    

    collectionView 和 tableView 都有助于进一步完善手势行为。

    【讨论】:

    • 在 iOS8 中,滚动视图现在默认为 touchesShouldCancelInContentView 返回 NO。为了使上述内容在 iOS8 上正常工作,您必须在您的 UIIScrollView 子类中重写此方法以返回 YES,否则任何 UIControl 内容都会搞砸行为。
    猜你喜欢
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    相关资源
    最近更新 更多