问题:
当 a 的UIPanGestureRecognizer
基础是 a UIScrollView
(不幸的是,这也会影响UIPageViewController
)时,maximumNumberOfTouches
它的行为并不像预期的那样 -minimumNumberOfTouches
但是总是正确地限制下端。
当监控这些参数时,他们似乎在做他们的工作——只是UIScrollView
不尊重他们并忽略了他们的价值观!
补救措施:
您可以在我的回答中找到解决方案:
UIScrollView 只能用一根手指滚动
顺便提一句:
one
您在手指平移和手指平移之间体验到的区别two
是因为您用一根手指使用panGestureRecognizer
. 用两根手指pinchGestureRecognizer
(也可以同时平移)启动,您没有减速阶段,松开手指后视图立即停止平移和缩放。停用pinchGestureRecognizer
,您会看到panGestureRecognizer
接管 - 即使是两个手指 - 并且平移再次平滑...... ;-)
同时 - 等等...
为完美的同时 2 根手指scrolling
和zooming
行为委托回调:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
self.pinchGestureRecognizer.enabled = NO;
}
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
self.pinchGestureRecognizer.enabled = NO;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
self.pinchGestureRecognizer.enabled = YES;
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
self.pinchGestureRecognizer.enabled = YES;
}
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
self.panGestureRecognizer.enabled = NO;
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
self.panGestureRecognizer.enabled = YES;
}
Fast pinch
开始放大!
Fast pan
开始平移!
用两个新手指在屏幕上停止减速平移并再次开始拖动不会让笨拙的 pinchGestureRecognizer 接管(默认),而是平稳地进入下一个平移/减速阶段 - 就像用一根手指!
对于完美主义者:
将 2 根手指放在屏幕上,然后 -现在不要移动- 如果您在前 0.5 秒内未开始捏合,则会zooming
被锁定并且只有panning
以下可用:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if ([gestureRecognizer.view isMemberOfClass:[MY_CustomScrollView class]]) {
NSLog(@"IN SCROLL-VIEW...");
if (gestureRecognizer == self.pinchGestureRecognizer) {
if (_pinchGestureLocked) {
NSLog(@"...but TOO late for zooming...");
return NO;
} else {
NSLog(@"...ZOOMING + PANNING...");
return YES;
}
} else if (gestureRecognizer == self.panGestureRecognizer){
if (gestureRecognizer.numberOfTouches > 2) {
NSLog(@"...but TOO many touches for PANNING ONLY...");
return NO;
} else {
NSLog(@"...PANNING...");
return YES;
}
} else {
NSLog(@"...NO PAN or PINCH...");
return YES;
}
} else {
NSLog(@"NOT IN SCROLL-VIEW...");
}
return YES;
}
BOOL _pinchGestureLocked = NO;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event];
_pinchGestureLocked = YES;
}
- (void) touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesCancelled:touches withEvent:event];
_pinchGestureLocked = NO;
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesEnded:touches withEvent:event];
_pinchGestureLocked = NO;
}
快乐的手势识别!