Хотя я знаю, что вложенные scrollViews не идеальны, наши дизайнеры предоставили мне эту настройку, поэтому я прилагаю все усилия, чтобы заставить ее работать. Пусть начнется!
Просмотр иерархии
- UIView
- UIScrollView (только для вертикальной прокрутки)
- UIImageView
- UICollectionView # 1 (только для горизонтальной прокрутки)
- UIImageView (отличается от предыдущего UIImageView)
- UICollectionView # 2 (только для вертикальной прокрутки)
- UIScrollView (только для вертикальной прокрутки)
Важное примечание
Все мои представления определяются с помощью программной автоматической компоновки. Каждое последующее представление в иерархии подзаголовков UIScrollView имеет зависимость y-координаты от представления, которое было до него.
Проблема
Для простоты немного изменим номенклатуру:
-
_outerScrollView
будет ссылаться наUIScrollView
-
_innerScrollView
будет ссылаться наUICollectionView #2
Я бы хотел, чтобы мой _outerScrollView
отправил свое событие касания к _innerScrollView
, достигнув нижней части его contentSize. Я бы хотел, чтобы произошло обратное, когда я прокручиваю назад.
В настоящее время у меня есть следующий код:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
CGFloat bottomEdge = [scrollView contentOffset].y + CGRectGetHeight(scrollView.frame);
if (bottomEdge >= [_outerScrollView contentSize].height) {
_outerScrollView.scrollEnabled = NO;
_innerScrollView.scrollEnabled = YES;
} else {
_outerScrollView.scrollEnabled = YES;
_innerScrollView.scrollEnabled = NO;
}
}
где начальные условия (до прокрутки) установлены на:
outerScrollView.scrollEnabled = YES;
innerScrollView.scrollEnabled = NO;
Что происходит?
При касании вида outerScrollView
прокручивается до нижнего края, а затем имеет эффект резинкой из-за _outerScrollView.bounces = YES;
Если я снова коснусь вида, прокрутка innerScrollView прокручивается до тех пор, пока он не достигнет своего нижнего края. На обратном пути тот же эффект резинкой имеет место в обратном порядке. То, что я хочу сделать, - это движение жидкости между двумя подзонами.
Очевидно, это связано с условиями scrollEnabled
, которые установлены в условном выражении в фрагменте кода. Я пытаюсь выяснить, как направить скорость/скорость одного scrollView на следующий scrollView при ударе по краю.
Любая помощь в этом вопросе будет с благодарностью.
Другие заметки
- Это не сработало для меня: https://github.com/ole/OLEContainerScrollView
- Я рассматриваю возможность размещения всего в иерархии UIScrollView (кроме UICollectionView # 2) внутри UICollectionView # 2
supplementaryView
. Не уверен, что это сработает.