ПРОБЛЕМА :
Когда UIPanGestureRecognizer
лежит в основе UIScrollView
(что, к сожалению, делаеттакже влияет UIPageViewController
) maximumNumberOfTouches
не работает должным образом - minimumNumberOfTouches
однако всегда ограничивает нижний пределправильно.
При мониторинге этих параметров они, кажется, выполняют свою работу - просто UIScrollView
не соблюдает их и игнорирует их значения!
REMEDY :
Вы можете найти решение в моем ответе на:
UIScrollView, прокрутка только одним пальцем
КСТАТИ:
Разница между one
finger и two
panning состоит в том, чтоодним пальцем вы используете panGestureRecognizer
.Двумя пальцами включается pinchGestureRecognizer
(который также может панорамироваться одновременно), и у вас нет фазы замедления, и изображение прекращает панорамирование и масштабирование сразу после отпускания пальцев.Отключите pinchGestureRecognizer
, и вы увидите, что panGestureRecognizer
вступает во владение - даже для двух пальцев - и панорамирование снова становится плавным ... ;-)
ОДНОВРЕМЕННО -et voilà ...
Делегирование обратных вызовов для идеального одновременного поведения двумя пальцами 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;
}
Счастливый жест-рузнавая!