From 6252ecd3de08c4c58fddef000fa9f8201c2692a8 Mon Sep 17 00:00:00 2001 From: Peike Luo Date: Fri, 27 Dec 2024 11:29:23 +0800 Subject: [PATCH] Optimize for horizontal scrolling UICollectionView. --- .../UICollectionViewLeftAlignedLayout.m | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/UICollectionViewLeftAlignedLayout/Sources/UICollectionViewLeftAlignedLayout.m b/UICollectionViewLeftAlignedLayout/Sources/UICollectionViewLeftAlignedLayout.m index a234789..18ba489 100644 --- a/UICollectionViewLeftAlignedLayout/Sources/UICollectionViewLeftAlignedLayout.m +++ b/UICollectionViewLeftAlignedLayout/Sources/UICollectionViewLeftAlignedLayout.m @@ -70,19 +70,21 @@ - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSInde NSIndexPath* previousIndexPath = [NSIndexPath indexPathForItem:indexPath.item-1 inSection:indexPath.section]; CGRect previousFrame = [self layoutAttributesForItemAtIndexPath:previousIndexPath].frame; CGFloat previousFrameRightPoint = previousFrame.origin.x + previousFrame.size.width; - CGRect currentFrame = currentItemAttributes.frame; - CGRect strecthedCurrentFrame = CGRectMake(sectionInset.left, - currentFrame.origin.y, - layoutWidth, - currentFrame.size.height); - // if the current frame, once left aligned to the left and stretched to the full collection view - // width intersects the previous frame then they are on the same line - BOOL isFirstItemInRow = !CGRectIntersectsRect(previousFrame, strecthedCurrentFrame); - - if (isFirstItemInRow) { - // make sure the first item on a line is left aligned - [currentItemAttributes leftAlignFrameWithSectionInset:sectionInset]; - return currentItemAttributes; + // Only work with UICollectionViewScrollDirectionVertical + if (self.scrollDirection == UICollectionViewScrollDirectionVertical) { + CGRect currentFrame = currentItemAttributes.frame; + CGRect strecthedCurrentFrame = CGRectMake(sectionInset.left, + currentFrame.origin.y, + layoutWidth, + currentFrame.size.height); + // if the current frame, once left aligned to the left and stretched to the full collection view + // width intersects the previous frame then they are on the same line + BOOL isFirstItemInRow = !CGRectIntersectsRect(previousFrame, strecthedCurrentFrame); + if (isFirstItemInRow) { + // make sure the first item on a line is left aligned + [currentItemAttributes leftAlignFrameWithSectionInset:sectionInset]; + return currentItemAttributes; + } } CGRect frame = currentItemAttributes.frame;