使 UICollectionView 始终以项目为中心停止滚动

Posted

技术标签:

【中文标题】使 UICollectionView 始终以项目为中心停止滚动【英文标题】:Make UICollectionView always stop scrolling with item centered 【发布时间】:2014-11-12 02:05:12 【问题描述】:

基本上,我想要一些类似于任务切换 UI 的东西,无论您如何滚动,项目总是以完全居中的方式结束。我认为这与分页不同,因为将可见多个项目(居中的项目,以及左侧和右侧的项目,如果它们存在的话)。

我怎样才能做到这一点(ios 7+)。

【问题讨论】:

【参考方案1】:

答案是在UIScrollViewDelegate 中使用-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 并基本上除以项目(包括行距等)并为目标提供适当的中心。

【讨论】:

【参考方案2】:

您需要通过实现滚动视图委托方法 didBeginDragging、scrollViewWillBeginDecelerating 来“滚动杰克”滚动视图:

在 scrollViewWillBeginDecelerating: 你可以调用 setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated 并计算任何 UICollectionViewCell 在中心的内容偏移量。

这应该会重新创建任务切换器 UI,如果您快速滚动,您可以在其中浏览许多应用程序,但它仍然会停留在中心的一个应用程序上。

【讨论】:

合理,但我不能让它感觉完全正确。任务切换器 UI 中不存在减速曲线的明显变化。 也许您可以覆盖 didScroll 并根据某个值降低 uiscrollview 减速率 不,我认为UIScrollViewDelegate scrollViewWillEndDragging:velocity:targetContentOffset 是正确的做法。【参考方案3】:

如果我正确理解您的问题,以下 Gist 代码可能会有所帮助:显示一个 UICollectionView,它在屏幕中心停止滚动项目。

/*
     *
        |<-------     view width     -------->|
        ---------------------------------------
        |                                     |
        |<-w0->|<ws>|<--   wi  -->|<ws>|<-w0->|
 ---------------    ---------------    ---------------
 |             |    |             |    |             |
 |             |    |             |    |             |
 ---------------    ---------------    ---------------
        |                                     |
        |                                     |
        ---------------------------------------
     * 
     * w0: itemEdgeOffset
     * ws: space
     * wi: itemWidth
     * in this example: ws == w0
     */

Gist link

【讨论】:

以上是关于使 UICollectionView 始终以项目为中心停止滚动的主要内容,如果未能解决你的问题,请参考以下文章

调整 UICollectionViewCells 的大小以始终填充 UICollectionView

UICollectionView Bounds Width 始终为 600

Swift UICollectionView 在点击时显示/隐藏项目

如何以编程方式使 UICollectionView 填充 UITableViewCell?

如何使 UICollectionView 的一部分中的所有项目浮动在滚动视图上?

UICollectionView 中的固定列数