【发布时间】:2014-11-05 17:43:47
【问题描述】:
虽然我知道嵌套的滚动视图并不理想,但我们的设计师为我提供了这种设置,所以我正在尽我所能让它发挥作用。开始吧!
查看层次结构
- UI 视图
-
UIScrollView(仅限垂直滚动)
- UIImageView
- UICollectionView #1(仅限水平滚动)
- UIImageView(不同于之前的UIImageView)
- UICollectionView #2(仅限垂直滚动)
-
UIScrollView(仅限垂直滚动)
重要提示
我所有的视图都是使用程序化自动布局定义的。 UIScrollView 的子视图层次结构中的每个连续视图都对其之前的视图具有 y 坐标依赖性。
问题
为了简单起见,让我们稍微修改一下命名法:
-
_outerScrollView将引用UIScrollView -
_innerScrollView将引用UICollectionView #2
我希望我的_outerScrollView 在到达其 contentSize 的底部时将其触摸事件路由到_innerScrollView。当我向上滚动时,我希望发生相反的情况。
目前我有如下代码:
- (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 滚动直到它到达其底部边缘。在回来的路上,同样的橡皮筋效应以相反的顺序发生。我想要发生的是在两个子视图之间进行流畅的运动。
显然,这是由于在代码 sn-p 的条件中设置的scrollEnabled 条件。我想弄清楚的是如何在碰到边缘时将一个滚动视图的速度/速度路由到下一个滚动视图。
在此问题上的任何帮助将不胜感激。
其他说明
- 这对我不起作用:https://github.com/ole/OLEContainerScrollView
- 我正在考虑将 UIScrollView 层次结构中的所有内容(UICollectionView #2 除外)放入 UICollectionView #2 >
supplementaryView。不确定这是否可行。
【问题讨论】:
-
一位熟人在 Twitter 上向我推荐了以下视频:asciiwwdc.com/2013/sessions/217。我现在正在检查。
-
_innerScrollView有多高?我的意思是它的frame,而不是它的contentSize。是和屏幕一样高吗?还是它比屏幕短,所以当它完全在屏幕上时,一些图像视图仍然可见?另外,_innerScrollView使用什么布局? -
我最终弄明白了。为了回答你的问题,innerScrollView 的 frame 是设备的宽度,大约是 viewController 主视图高度的 1/3。
标签: ios objective-c uiscrollview uicollectionview ios8