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

时间:2011-11-09 23:14:21

标签: ios uitableview uiscrollview gestures

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

enter image description here

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

我想弄清楚当用户用两根手指触摸任何地方并且只用两根手指触摸时,如何在UIScrollView及其子UITableViews上禁用所有滚动。我已经尝试过覆盖触摸的各种各样的触摸,触摸,触摸,触摸,取消等等......但我无法做到这一点。非常感谢任何帮助。

这是我的手势处理代码:

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

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果您使用滑动识别器进行双指滑动,则当双指识别器识别出其手势时,需要滚动视图的识别器(包括表格视图 - 它们也是滚动视图)才会失败

[[scrollView panGestureRecognizer] requireGestureRecognizerToFail: twoFingerRecogniser];

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

(P.S。:“识别者”是英国英语,不是拼写错误。)

希望有所帮助。 : - )

答案 2 :(得分:0)

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

这是scrollViewDelegate方法: -

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)aScrollView { 返回aScrollView;}

答案 3 :(得分:0)

你应该做的一件事是在行动之前检查手势是否已经完成:

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

我知道其他事情会发生奇怪的事情。

答案 4 :(得分:0)

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