使 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?