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;
}
}
有人知道,它如何解决这个问题?
感谢。
答案 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;