如何在Scroll上设置UICollectionViewCell的大小,使其中间最大?

我有一个UICollectionView显示几行与一个全宽列(看起来像一个UITableView)

我想达到的是类似于这样的:

UICollectionView与动画

…中间的细胞有更高的高度。 当用户向上和向下滚动时,中间单元格之前和之后的单元格animation回到给定单元格的默认高度。

有人可以概述我应该如何解决这个问题?

我在水平的UICollectionView使用这个Swift 3代码。

 func scrollViewDidScroll(_ scrollView: UIScrollView) { let centerX = scrollView.contentOffset.x + scrollView.frame.size.width/2 for cell in mainCollectionView.visibleCells { var offsetX = centerX - cell.center.x if offsetX < 0 { offsetX *= -1 } cell.transform = CGAffineTransform(scaleX: 1, y: 1) if offsetX > 50 { let offsetPercentage = (offsetX - 50) / view.bounds.width var scaleX = 1-offsetPercentage if scaleX < 0.8 { scaleX = 0.8 } cell.transform = CGAffineTransform(scaleX: scaleX, y: scaleX) } } } 

您需要创build一个UICollectionViewLayout的自定义子类。

首先,override - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds返回yes,这样,当你的集合被滚动时,你可以改变单元格的布局属性。

之后,您的重要方法是:

 - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect 

 - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 

我build议阅读一篇关于自定义集合视图布局的文章 。 这可能是很重的题材。

由于UICollectionViewUIScrollView的子类,因此可以通过将您的collectionView视为scrollView来解决此问题。
设置UIScrollViewDelegate和实现scrollViewDidScroll ,然后做这样的事情:

 -(void)scrollViewDidScroll:(UIScrollView *)scrollView { for (int i = 0; i < [scrollView.subviews count]; i++) { UIView *cell = [scrollView.subviews objectAtIndex:i]; float position = cell.center.y - scrollView.contentOffset.y; float offset = 1.5 - (fabs(scrollView.center.y - position) * 1.0) / scrollView.center.y; if (offset<1.0) { offset=1.0; } cell.transform = CGAffineTransformIdentity; cell.transform = CGAffineTransformScale(cell.transform, offset, offset); } } 

希望这会解决你的问题。