虽然我知道嵌套的 ScrollView 并不理想,但我们的设计师为我提供了这个设置,所以我正在尽我所能让它发挥作用。让我们开始吧!
查看层次结构
- 界面 View
- UIScrollView(仅限垂直滚动)
- 界面 ImageView
- UICollectionView #1(仅限水平滚动)
- UIImageView(不同于之前的UIImageView)
- UICollectionView #2(仅限垂直滚动)
- UIScrollView(仅限垂直滚动)
重要提示
我所有的 View 都是使用程序化自动布局定义的。 UIScrollView 的 subview 层次结构中的每个连续 View 都依赖于它之前出现的 View 的 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;
会发生什么?
触摸 View 后,outerScrollView
滚动到其底部边缘,然后由于 _outerScrollView.bounces = YES;
而具有橡皮筋效果如果我再次触摸 View ,innerScrollView 会滚动直到它到达底部边缘。在返回的路上,同样的橡皮筋效应以相反的顺序发生。我想要发生的是在两个 subview 之间进行流畅的运动。
显然,这是由于 scrollEnabled
在代码段的条件中设置的条件。我想弄清楚的是如何在到达边缘时将一个 scrollView 的速度/速度路由到下一个 scrollView。
在此问题上的任何帮助将不胜感激。
其他注意事项
- 这对我不起作用:https://github.com/ole/OLEContainerScrollView
- 我正在考虑将 UIScrollView 层次结构中的所有内容(UICollectionView #2 除外)放入 UICollectionView #2
supplementaryView
.不确定这是否可行。
最佳答案
想通了!
首先:
_scrollView.pagingEnabled = YES;
第二个:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView == _scrollView || scrollView == _offersCollectionView) {
CGFloat offersCollectionViewPosition = _offersCollectionView.contentOffset.y;
CGFloat scrollViewBottomEdge = [scrollView contentOffset].y + CGRectGetHeight(scrollView.frame);
if (scrollViewBottomEdge >= [_scrollView contentSize].height) {
_scrollView.scrollEnabled = NO;
_offersCollectionView.scrollEnabled = YES;
} else if (offersCollectionViewPosition <= 0.0f && [_offersCollectionView isScrollEnabled]) {
[_scrollView scrollRectToVisible:[_scrollView frame] animated:YES];
_scrollView.scrollEnabled = YES;
_offersCollectionView.scrollEnabled = NO;
}
}
}
地点:
_scrollView
是_outerScrollView
_offersCollectionView
是_innerScrollView
(在我的原始帖子中是 UICollectionView #2)。
这是现在发生的事情:
- 当我向上滑动(因此 View 向下移动)时,
offersCollectionView
接管整个 View ,将其他 subview 移出 View 。 - 如果我向下滑动(因此 View 向上),其余 subview 将通过 scrollView 的弹跳效果重新聚焦。
关于ios - 在 UIScrollView 嵌套的 UICollectionView 之间连续垂直滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793141/