我在水平滚动的UICollectionView上有不同高度的单元格,它们似乎垂直均匀地分布单元格,在单元格之间留下空白空间,我想在顶部对齐它们并在每列底部有变量空白空间.
解决方法
我将提供的UICollectionViewFlowLayout扩展到了我的UICollectionView.以下压倒一切对我有用.
#import "TopAlignedCollectionViewFlowLayout.h" const NSInteger kVerticalSpacing = 10; @implementation TopAlignedCollectionViewFlowLayout - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { NSArray* attributesToReturn = [super layoutAttributesForElementsInRect:rect]; for (UICollectionViewLayoutAttributes* attributes in attributesToReturn) { if (nil == attributes.representedElementKind) { NSIndexPath* indexPath = attributes.indexPath; attributes.frame = [self layoutAttributesForItemAtIndexPath:indexPath].frame; } } return attributesToReturn; } - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewLayoutAttributes* currentItemAttributes = [super layoutAttributesForItemAtIndexPath:indexPath]; UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout sectionInset]; if (indexPath.item == 0) { CGRect frame = currentItemAttributes.frame; frame.origin.y = sectionInset.top; currentItemAttributes.frame = frame; return currentItemAttributes; } NSIndexPath* prevIoUsIndexPath = [NSIndexPath indexPathForItem:indexPath.item-1 inSection:indexPath.section]; CGRect prevIoUsFrame = [self layoutAttributesForItemAtIndexPath:prevIoUsIndexPath].frame; CGFloat prevIoUsFrameRightPoint = prevIoUsFrame.origin.y + prevIoUsFrame.size.height + kVerticalSpacing; CGRect currentFrame = currentItemAttributes.frame; CGRect strecthedCurrentFrame = CGRectMake(currentFrame.origin.x,currentFrame.size.width,self.collectionView.frame.size.height ); if (!CGRectIntersectsRect(prevIoUsFrame,strecthedCurrentFrame)) { CGRect frame = currentItemAttributes.frame; frame.origin.y = frame.origin.y = sectionInset.top; currentItemAttributes.frame = frame; return currentItemAttributes; } CGRect frame = currentItemAttributes.frame; frame.origin.y = prevIoUsFrameRightPoint; currentItemAttributes.frame = frame; return currentItemAttributes; } @end