Ответ 1
Я решил проблему следующим образом. Я не очень доволен этим, так как он выглядит слишком сложным, но он работает (обратите внимание, что приведенный ниже код является упрощенной, непроверенной версией моего кода, что связано с другим сложным интерфейсом):
У меня есть 3 свойства, которые управляют прокруткой:
@property (nonatomic, assign) CGFloat currentPanY;
@property (nonatomic, assign) BOOL scrollA;
@property (nonatomic, assign) BOOL scrollB;
2-ступенчатая прокрутка:
Отключить прокрутку для B и включить прокрутку для A.
Это позволяет прокручивать A.
Когда A достигнет своего максимального положения, отключите прокрутку для A и включите прокрутку для B:
-(void)scrollViewDidScroll: (UIScrollView *)scrollView {
if (scrollView.contentOffset.y >= self.maxScrollUpOffset) {
[scrollView setContentOffset:CGPointMake(0, self.maxScrollUpOffset) animated:NO];
self.scrollviewA.scrollEnabled = NO;
self.scrollviewB.scrollEnabled = YES;
self.scrollB = YES;
}
}
Это дает следующий эффект:
Когда A прокручивается вверх, она перестанет прокручиваться, когда достигнут максимальный размер. Однако B не начнет прокрутку, так как распознающий знак жесткого диска A не пересылает свои действия распознавателю жесты на букву B. Таким образом, нужно поднять палец и начать вторую прокрутку. Затем, B будет прокручиваться. Это дает 2-ступенчатую прокрутку.
Непрерывная прокрутка:
Для непрерывной прокрутки B должен прокручиваться, пока палец, который начал прокрутку A, продолжает двигаться вверх. Чтобы обнаружить это, я добавил еще один распознаватель жесты таза A и активировал его одновременное обнаружение жестов со встроенными распознавателями жестов A и B:
- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UISwipeGestureRecognizer *)otherGestureRecognizer {
return YES;
}
В действии этого дополнительного распознавателя распознавания жеста, я вычисляю расстояние, которое пальцем движется вверх после того, как достигнут предел прокрутки A. На этом расстоянии B затем прокручивается программно:
- (void)panGestureRecognizerAction:(UIPanGestureRecognizer *)recognizer {
if (recognizer.state != UIGestureRecognizerStateChanged) {
self.currentPanY = 0;
self.scrollB = NO;
self.scrollA = NO;
} else {
CGPoint currentTranslation = [recognizer translationInView:self.scrollviewA];
CGFloat currentYup = currentTranslation.y;
if (self.scrollA || self.scrollB) {
if (self.currentPanY == 0) {
self.currentPanY = currentYup;
}
CGFloat additionalYup = self.currentPanY - currentYup;
if (self.scrollA) {
CGFloat offset = self.scrollviewA.scrollUpOffset + additionalYup;
if (offset >= 0) {
self.scrollviewA.contentOffset = CGPointMake(0, offset);
} else {
self.scrollviewA.contentOffset = CGPointZero;
}
} else if (self.scrollB){
self.scrollviewB.contentOffset = CGPointMake(0, additionalYup);
}
}
}
}
По-прежнему существует недостаток:
Если вы начнете прокрутку, поднимите палец и позвольте scrollView замедляться, он будет вести себя как двухступенчатая прокрутка, так как дополнительный распознаватель жесты не распознает любой жест панорамы.