UIScrollView只用一根手指滚动

时间:2015-03-13 11:42:50

标签: ios objective-c ios7 uiscrollview ios8

iOS7& iOS8上

我需要禁用2个或3个手指在UIScrollview中滚动。

我试过了:

[self.scrollView.panGestureRecognizer setMaximumNumberOfTouches:1];
[self.scrollView.panGestureRecognizer setMinimumNumberOfTouches:1];

但它没有效果。仍然可以用两根手指滚动。

如果我试图将最大值和最小值设置为2.禁用一个手指滚动但可以滚动3个手指:(

我也试过了,但没有成功:

for (UIGestureRecognizer* pan in self.scrollView.gestureRecognizers) {
        OTTNSLog(@"touches: %ld", (unsigned long)pan.numberOfTouches);
        if ([pan isKindOfClass:[UIPanGestureRecognizer class]])
        {
            UIPanGestureRecognizer *mpanGR = (UIPanGestureRecognizer *) pan;
            mpanGR.minimumNumberOfTouches = 1;
            mpanGR.maximumNumberOfTouches = 1;

        }

        if ([pan isKindOfClass:[UISwipeGestureRecognizer class]])
        {
            UISwipeGestureRecognizer *mswipeGR = (UISwipeGestureRecognizer *) pan;
            mswipeGR.numberOfTouchesRequired = 1;
        }

    }

有人知道,它如何解决这个问题?

感谢。

4 个答案:

答案 0 :(得分:1)

<强> 问题:

UIPanGestureRecognizer 作为 UIScrollView 的基础时 - 遗憾的是,这也会影响 UIPageViewController - maximumNumberOfTouches 的行为不符合预期, minimumNumberOfTouches 但总是限制正确的下端。

在监控这些参数时,他们会报告正确的值 - 他们似乎正在做他们的工作 - 只是UIScrollView本身不尊重他们并忽略他们的设置!

<强> SOLUTION:

minimumNumberOfTouches 设置为所需的值,例如1 - 非常重要的是 - maximumNumberOfTouches 到2 !!!

myScrollView.panGestureRecognizer.minimumNumberOfTouches = 1;
myScrollView.panGestureRecognizer.maximumNumberOfTouches = 2;

在scrollView的@interface声明中符合 UIGestureRecognizerDelegate 协议。您不必为panGestureRecognizer.delegate设置UIScrollView!该委托已经设置,因为UIScrollView需要成为其自己pan/pinchGestureRecognizer的委托。

然后实施 UIGestureRecognizer 委托方法:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

    NSLog(@"%d", gestureRecognizer.numberOfTouches);
    NSLog(@"%@", gestureRecognizer.description);

        if (gestureRecognizer == self.panGestureRecognizer) {
            if (gestureRecognizer.numberOfTouches > 1) {
                return NO;
            } else {
                return YES;
            }
        } else {
            return YES;
        }
    }
}

甚至更安全的版本:

如果你有一个自定义的scrollView类,并且想要非常安全,你还可以添加一行代码来消除其他scrollViews的歧义:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {

    NSLog(@"%d", gestureRecognizer.numberOfTouches);
    NSLog(@"%@", gestureRecognizer.description);

    if ([gestureRecognizer.view isMemberOfClass:[MY_CustomcrollView class]]) {
        if (gestureRecognizer == self.panGestureRecognizer) {
            if (gestureRecognizer.numberOfTouches > 1) {
                return NO;
            } else {
                return YES;
            }
        } else {
            return YES;
        }
    } else {
        return YES;
    }
}

其他信息:

NSLog 会告诉您触摸的次数。如果您将 min max 设置为相同的值(如上例中的1){ {1}}永远不会被触发......; - )

这就是为什么 if-loop 必须至少 maximumNumberOfTouches < / p>

minimumNumberOfTouches + 1

GEEK SECTION:

panGestureRecognizer.minimumNumberOfTouches = 1;
panGestureRecognizer.maximumNumberOfTouches = minimumNumberOfTouches + 1;

这是访问负责分页 for (UIView *view in self.view.subviews) { if ([view isKindOfClass:[UIScrollView class]]) { NSLog(@"myPageViewController - SCROLLVIEW GESTURE RECOGNIZERS: %@", view.gestureRecognizers.description); ((UIPanGestureRecognizer *)view.gestureRecognizers[1]).minimumNumberOfTouches = 1; ((UIPanGestureRecognizer *)view.gestureRecognizers[1]).maximumNumberOfTouches = 2; } } 的基础scrollView的方法。将此代码放入例如 UIPageViewController (自我)的 viewDidLoad:

如果您根本无权访问scrollView - 例如动态UIPageViewController中的UIPageViewController,其中创建和单元重用在运行时发生,并且无法在其contentView上设置出口 - 在UITableViewCell上放置一个类别并覆盖那里的委托方法。不过要小心!这会影响应用程序中的每个scrollView - 所以要进行适当的内省(类检查),就像我上面的'EVEN SAFER'示例一样......; - )

<强> 旁注:

不幸的是,同样的技巧不适用于 UIScrollView 上的 pinchGestureRecognizer 因为它没有公开 UIScrollView 属性。在监控时,它总是会报告2次触摸(您显然需要捏合) - 因此其内部 min/maxNumberOfTouches 似乎已设置为2 - 即使< strong> min/maxNumberOfTouches 不尊重自己的设置,并保持愉快地捏任意数量的手指(超过2)。所以没有办法限制捏到有限数量的手指......

答案 1 :(得分:0)

我可以确认这仍然是iOS 8中的一个问题,但仅当UIPanGestureRecognizer是UIScrollView的基础时。使用新的UIPanGestureRecognizer创建UIView并设置其maximumNumberOfTouches属性可以按预期工作。

有趣的提示:如果您在滚动时查询UIScrollView的UIPanGestureRecognizer,它会将触摸次数报告为小于或等于最大值。换句话说,如果您将最大值设置为2,并使用3个手指滚动,则会将手势报告为双指滚动。随后,在继续通常(但不是一致地)滚动的同时一个一个地放下手指也会减少报告的触摸次数 - 所以如果你从3开始 - > 2 - &gt; 1个手指,它将注册2 - > 1 - &gt; 0触摸,并在设备上还有一根手指时停止滚动。

提交rdar:// 20890684并复制到http://openradar.appspot.com/radar?id=6191825677189120。请随意欺骗。

答案 2 :(得分:0)

没有具体的方法可以做一些技巧,但结果只有75%。

添加滑动手势(每个方向4个)并双击手势到您的UIScrollview ..然后使用下面的代码..

    [[yourScrollView panGestureRecognizer] requireGestureRecognizerToFail:swipeDown];
    [[yourScrollView panGestureRecognizer] requireGestureRecognizerToFail:swipeLeft];
    [[yourScrollView panGestureRecognizer] requireGestureRecognizerToFail:swipeRight];
    [[yourScrollView panGestureRecognizer] requireGestureRecognizerToFail:swipeUp];
    [[yourScrollView panGestureRecognizer] requireGestureRecognizerToFail:doubleTap];

答案 3 :(得分:-2)

这将为您完成这项工作:

yourscrollView.multipleTouchEnabled=NO;