iOS:使用 2 个手指时取消 UIScrollView 触摸

Posted

技术标签:

【中文标题】iOS:使用 2 个手指时取消 UIScrollView 触摸【英文标题】:iOS: Cancel UIScrollView touches when using 2 fingers 【发布时间】:2011-11-09 23:14:20 【问题描述】:

我编写了一个 UIScrollView 子类,用于滚动一系列 UITableView。见下图:

如您所见,我有几个垂直滚动的 UITableView,它们在父 UIScrollView 内水平滚动。这一切都很好。然而,该应用程序有许多全局 手势。例如,如果我用 2 根手指向给定方向滑动,我会执行 UIView 转换到应用程序的另一部分。但是如果我在滚动视图和/或其子表视图顶部做手势,它们自然会滚动它们的内容。这看起来不太好,并且会导致一些布局问题。

我想弄清楚的是,当用户用两根手指且仅用两根手指触摸 anywhere 时,如何禁用 UIScrollView 及其子 UITableViews 上的所有滚动。我已经尝试过覆盖 touchesBegan、touchesEnded、touchesShouldCancel 等的变体……但我不能完全正确。非常感谢任何帮助。

这是我的手势处理代码:

UISwipeGestureRecognizer *twoFingerSwipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleTwoFingerSwipe:)];
[twoFingerSwipeUp setNumberOfTouchesRequired:2];
[twoFingerSwipeUp setDirection:UISwipeGestureRecognizerDirectionUp];
[twoFingerSwipeUp setDelegate:self];

// 'self' is the superview of the UIScrollView, which is a UIView.
[self addGestureRecognizer:twoFingerSwipeUp];

[twoFingerSwipeUp release];

// ... repeat the above code for up, down, left, right gestures ...

- (void)handleTwoFingerSwipe:(UISwipeGestureRecognizer*)swipeGesture 

    switch ([swipeGesture direction]) 

        case UISwipeGestureRecognizerDirectionUp:            
            [self changeToView:viewAbove];
            break;

        case UISwipeGestureRecognizerDirectionDown:
            [self changeToView:viewBelow];            
            break;

        case UISwipeGestureRecognizerDirectionRight:
            [self changeToView:viewToTheRight];
            break;

        case UISwipeGestureRecognizerDirectionLeft:
            [self changeToView:viewToTheLeft];
            break;            
    

【问题讨论】:

【参考方案1】:

尝试在所有滚动和表格视图上设置 panGestureRecognizer.maximumNumberOfTouches = 1(仅限 ios 5)。

【讨论】:

如果一根手指在 1 个 tableview 上,而你的另一根手指在另一个 tableview 上,这不起作用。 实际上这似乎根本不起作用......我仍然可以用 2 个手指左右滚动父 scrollView。【参考方案2】:

如果您将滑动识别器用于两指滑动,则要求滚动视图的识别器(包括表格视图 - 它们也是滚动视图)在两指识别器识别其手势时失败.

[[scrollView panGestureRecognizer] requireGestureRecognizerToFail: twoFingerRecogniser];

为每个滚动视图和表格视图迭代上面的代码。

(P.S.:“recogniser”是英式英语,不是拼写错误。)

希望对您有所帮助。 :-)

【讨论】:

这似乎不起作用,scrollView 和 tableViews 都还在滚动。另外,正如我在问题中所说,我有多个两指滑动手势,似乎方法只允许我设置一个。 panGestureRecognizer 访问器也仅适用于 iOS 5。【参考方案3】:

编写以下代码: scrollView.minimumZoomScale=1.0;scrollView.maximumZoomScale=1.0; scrollView.delegate self];

这里是 scrollViewDelegate 方法:-

-(UIView*)viewForZoomingInScrollView:(UIScrollView *)aScrollView 返回一个滚动视图;

【讨论】:

【参考方案4】:

您应该做的一件事是在操作之前检查手势是否已完成:

if (swipeGesture.state == UIGestureRecognizerStateEnded) 
   // Do your think

我知道否则会发生奇怪的事情。

【讨论】:

很高兴知道,但在这种情况下似乎没有任何区别。【参考方案5】:

只需在父滚动视图中禁用用户交互。您需要一个 UIWindow 子类并覆盖 -sendEvent: 方法,因为它在任何手势识别器之前被调用。在那里,如果您检测到两次触摸,请发送通知。让滚动视图监听它并在它发生时禁用用户交互。如果触摸结束,让它重新启用用户交互。

【讨论】:

以上是关于iOS:使用 2 个手指时取消 UIScrollView 触摸的主要内容,如果未能解决你的问题,请参考以下文章

将手指拖离它时取消选择 UIView“按钮”

未检测到 SDL2 iOS 多点触控第二个手指向下

移动端库

H5页面在ios中平滑滚动

如何延迟/减慢 UIScrollView 平移速度

通过多个 UIView 注册触摸