2015-03-13 104 views
1

iOS7 & iOS8上的UIScrollView只用一个手指滚动

我需要禁用2或三根手指在滚动UIScrollview

我想:

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

但它没有任何效果。仍然可以用2个手指滚动。

如果我试图最大值和最小值设置为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; 
     } 

    } 

有谁知道?,如何解决这个

感谢

+0

此链接可能会有所帮助:http://stackoverflow.com/questions/8210614/disable-2-finger-scrolling-in-uiscrollview – vignesh 2015-03-16 13:34:30

回答

0

这将做的工作适合你:

yourscrollView.multipleTouchEnabled=NO; 
0

我可以确认这仍然是iOS 8中的一个问题,但只有当UIPanGestureRecognizer是基础UIScrollView。使用新的UIPanGestureRecognizer创建一个UIView并设置其maximumNumberOfTouches属性按预期工作。有趣的是:如果您在滚动时查询UIScrollView的UIPanGestureRecognizer,它会将触摸次数报告为小于或等于最大值。换句话说,如果您将最大值设置为2,并用3个手指进行滚动,则会将该手势报告为双指滚动。随后一次放一个手指,同时继续滚动(但不一致)会减少所报告的触摸次数 - 所以如果您从3 - > 2 - > 1手指移动,则会注册2 - > 1 - > 0触摸,并在设备上仍有1个手指时停止滚动。

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

0

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

添加滑动手势(各4个方向)和双击手势以下代码的UIScrollview..Then使用..

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

问题:

UIPanGestureRecognizer是底部UIScrollView - 不幸的是也影响UIPageViewController - 所述maximumNumberOfTouches未按预期行为时,minimumNumberOfTouches然而总是正确地限制下端。

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


SOLUTION:

设置minimumNumberOfTouches到期望值例如1 - 非常重要 - maximumNumberOfTouches to 2 !!!

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

顺应你的滚动视图的@interface声明UIGestureRecognizerDelegate协议。您不必为UIScrollView设置panGestureRecognizer.delegate !!!代表已被设置,因为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; 
     } 
    } 
} 

AN更安全的版本:

如果你有一个自定义的滚动视图类,并想成为在非常安全的一面,您还可以添加一行代码以消除歧义E协同对抗其他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小号告诉你触摸的数量。如果你(在上面的例子一样1)两个分钟最大设置为相同的值if-loop永远不会被触发...;-)

这就是为什么maximumNumberOfTouches必须至少minimumNumberOfTouches + 1

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

GEEK部分:

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:UIPageViewController(个体经营)。

如果您没有访问滚动视图的话 - 像在动态UITableViewCell其中创建和单元复用发生在运行时,没有网点可在其contentViews设置一个UIPageViewController - 把一个类别上UIScrollView和覆盖那里的委托方法。不过要小心!这个效果每滚动视图在您的应用程序 - 这样做适当的内省(类检查)像我的“更安全”上面的例子... ;-)


旁注:

不幸同样的伎俩不与pinchGestureRecognizerUIScrollView工作,因为它不公开min/maxNumberOfTouches财产。当监测它始终报告2点触摸(你显然需要捏) - 所以其内部min/maxNumberOfTouches似乎一直都设置为2 - 即使UIScrollView没有履行它自己的设置和保持愉快用任何数量的手指捏(超过2)。所以没有办法限制捏手指有限的数量...