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 触摸的主要内容,如果未能解决你的问题,请参考以下文章