在 UIScrollView 中禁用 2 指滚动

Posted

技术标签:

【中文标题】在 UIScrollView 中禁用 2 指滚动【英文标题】:Disable 2 finger scrolling in UIScrollView 【发布时间】:2011-11-21 10:54:11 【问题描述】:

我想在我的UIScrollView 中禁用两指滚动。 我对它进行了子类化,并使用以下代码调整了它的内置手势识别器:

for (UIGestureRecognizer *mgestureRecognizer in scroller.gestureRecognizers)      
    if ([mgestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
    
        UIPanGestureRecognizer *mpanGR = (UIPanGestureRecognizer *) mgestureRecognizer;
        mpanGR.minimumNumberOfTouches = 1; 
        mpanGR.maximumNumberOfTouches = 1;

    

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

由于某种原因,maximumNumberOfTouches 似乎不起作用。我仍然可以用一根或两根手指滚动。如果我将两个属性都更改为2,我可以成功禁用单指滚动并需要两次触摸。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我意识到这是一个旧线程,但我花了很长时间才弄清楚这一点,所以我想我会分享。以下是我禁用两指滚动的方法:

// set up a two-finger pan recognizer as a dummy to steal two-finger scrolls from the scroll view
// we initialize without a target or action because we don't want the two-finger pan to be handled
UIPanGestureRecognizer *twoFingerPan = [[UIPanGestureRecognizer alloc] init];
twoFingerPan.minimumNumberOfTouches = 2;
twoFingerPan.maximumNumberOfTouches = 2;
[scrollView addGestureRecognizer:twoFingerPan];

【讨论】:

不应该是 1 的最小值和最大值吗? (而不是 2 ?) 代码通过吃掉两指平移手势来禁用两指平移。所以最小和最大接触应该是 2。 为我工作,但找不到任何其他方法。非常感谢! 感谢您的提示。让我们的应用表现得更好。【参考方案2】:

如果你使用 ios SDK 5.0 以上,或许你可以直接使用 ui pan 手势识别器。

@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;

......

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

问题

UIPanGestureRecognizerUIScrollView 的基础(不幸的是,这也会影响UIPageViewControllermaximumNumberOfTouches em> 的行为与预期不符 - minimumNumberOfTouches 但始终正确限制下限。

在监控这些参数时,它们似乎在做自己的工作 - 只是 UIScrollView 不尊重它们并忽略它们的值!


补救措施

您可以在我的回答中找到解决方案:

UIScrollView scrolling only with one finger

【讨论】:

以上是关于在 UIScrollView 中禁用 2 指滚动的主要内容,如果未能解决你的问题,请参考以下文章

在 UIScrollView 上禁用手动缩放

在 UIScrollView Swift 中禁用垂直滚动

Objective-C:如何在 UIScrollView 中禁用垂直滚动

如何在 Objective C 中的 UIScrollView 中禁用动画滚动?

如何在 UIScrollView 中仅禁用垂直滚动?

在可缩放的滚动视图中禁用图像视图缩放