问题:
当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
和覆盖那里的委托方法。不过要小心!这个效果每滚动视图在您的应用程序 - 这样做适当的内省(类检查)像我的“更安全”上面的例子... ;-)
旁注:
不幸同样的伎俩不与pinchGestureRecognizer
上UIScrollView
工作,因为它不公开min/maxNumberOfTouches
财产。当监测它始终报告2点触摸(你显然需要捏) - 所以其内部min/maxNumberOfTouches
似乎一直都设置为2 - 即使UIScrollView
没有履行它自己的设置和保持愉快用任何数量的手指捏(超过2)。所以没有办法限制捏手指有限的数量...
此链接可能会有所帮助:http://stackoverflow.com/questions/8210614/disable-2-finger-scrolling-in-uiscrollview – vignesh 2015-03-16 13:34:30