在UIScrollView中嵌入一个UICollectionView几乎完美运作

10

背景

我在一个UIScrollView内嵌了一个UICollectionView,它几乎完美地工作。

目标

可滚动的元素应该在达到其内容视图的末尾后无缝传递滚动。当我在UIScrollView上向下滑动时,它应该向下滚动,使UICollectionView占屏幕的约90%,然后继续滚动collectionView。反之亦然,当我在collectionView上向上滚动并到达collectionView内容的顶部时,scrollView应该开始向上滚动。

问题

1) 当我在collectionView上向上滚动时,它会滚动到顶部并停止。如果我连续向下轻扫几次,它仍然会弹回collectionView而不是向上滚动scrollView。我必须再次“有意地”点击collectionView才能使父级ScrollView向上滚动。

请参见gif:
double bounce

我想这可能与CancelContentTouches有关,但我还没有找到正确的组合。

2) 向下滚动时也是同样的情况,一旦scrollView到达内容视图的末尾,它就会停止并弹回。

请参见gif:
Scroll down and stick

注意:将UICollectionView放在UIScrollView中并不是特别推荐的方法。我尝试了下面列出的替代方法,但是将我的顶部视图放在标题中后,我无法实现期望的效果。我希望能够独立地滚动两个视图,所以我决定使用scrollView/collectionView组合。

视图层次结构

MainViewController
- ScrollView
-- Profile Stats
-- CollectionViewContainerView
--- CollectionView

其他想把collectionView放入scrollView的人可以参考以下资源:
我尝试过这些方法,但它们并不适用于我的使用情况。


我相信这是第一响应者的问题。看看你如何通过它。也许在某个偏移量处,你可以使用becomeFirstResponder()。可能需要同时将resignFirstResponder与scrollView结合起来使用。反之亦然。 - agibson007
你可以在 Twitter iOS 应用程序的个人资料视图中看到平滑滚动。我尝试复制它并取得了与你相同的进展,但随后卡住了。在开发此功能时,我尝试了 @abigson007 的答案,但它没有起作用,因为 CollectionView 上方的视图也需要响应滚动事件。 - Akash More
你最终解决了这个问题吗? - Yasha
我有一个类似的问题需要解决,但是我必须将collectionView嵌入到scrollView中,因为我使用的组件需要使用scrollView。你能解决这个问题吗?我的应用程序中也有类似的滚动问题。 - ShowPony
1个回答

1
如果您在另一个scrollview或其子类中使用scrollview或其子类,则会发生这种情况。
现在,您可以做一件事。为一个(推荐使用内部scrollview)禁用滚动,并实现scrollview的代理,如scrollViewDidScroll或其他更合适的代理,并手动滚动内部scrollview(通过设置内部scrollview的内容偏移量)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接