【问题标题】:iOS: Cancel UIScrollView touches when using 2 fingersiOS:使用 2 个手指时取消 UIScrollView 触摸
【发布时间】: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;            
    }
}

【问题讨论】:

    标签: ios uitableview uiscrollview gestures


    【解决方案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: 方法,因为它在任何手势识别器之前被调用。在那里,如果您检测到两次触摸,请发送通知。让滚动视图监听它并在它发生时禁用用户交互。如果触摸结束,让它重新启用用户交互。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-26
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 2012-08-27
        相关资源
        最近更新 更多