diff --git a/Source/IGListCollectionViewLayout.mm b/Source/IGListCollectionViewLayout.mm index 1d678564..af3d62bc 100644 --- a/Source/IGListCollectionViewLayout.mm +++ b/Source/IGListCollectionViewLayout.mm @@ -175,6 +175,14 @@ static void adjustZIndexForAttributes(UICollectionViewLayoutAttributes *attribut return attributes; } + // avoid OOB errors + const NSInteger section = indexPath.section; + const NSInteger item = indexPath.item; + if (section >= _sectionData.size() + || item >= _sectionData[section].itemBounds.size()) { + return nil; + } + attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; attributes.frame = _sectionData[indexPath.section].itemBounds[indexPath.item]; adjustZIndexForAttributes(attributes); @@ -192,8 +200,13 @@ static void adjustZIndexForAttributes(UICollectionViewLayoutAttributes *attribut return attributes; } - UICollectionView *collectionView = self.collectionView; + // avoid OOB errors const NSInteger section = indexPath.section; + if (section >= _sectionData.size()) { + return nil; + } + + UICollectionView *collectionView = self.collectionView; const IGListSectionEntry entry = _sectionData[section]; const CGFloat minY = CGRectGetMinY(entry.bounds); diff --git a/Tests/IGListCollectionViewLayoutTests.m b/Tests/IGListCollectionViewLayoutTests.m index df764877..7471ce15 100644 --- a/Tests/IGListCollectionViewLayoutTests.m +++ b/Tests/IGListCollectionViewLayoutTests.m @@ -694,4 +694,34 @@ XCTAssertEqual(CGRectGetHeight(expected), CGRectGetHeight(frame)); \ IGAssertEqualFrame([self cellForSection:5 item:0].frame, 277, 139, 136, 136); } +- (void)test_whenQueryingAttributes_withSectionOOB_thatReturnsNil { + [self setUpWithStickyHeaders:NO topInset:0 stretchToEdge:YES]; + [self prepareWithData:@[ + [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero + lineSpacing:0 + interitemSpacing:0 + headerHeight:0 + items:@[ + [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(33, 33)], + [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(65, 33)], + ]], + ]]; + XCTAssertNil([self.layout layoutAttributesForItemAtIndexPath:quickPath(4, 0)]); +} + +- (void)test_whenQueryingAttributes_withItemOOB_thatReturnsNil { + [self setUpWithStickyHeaders:NO topInset:0 stretchToEdge:YES]; + [self prepareWithData:@[ + [[IGLayoutTestSection alloc] initWithInsets:UIEdgeInsetsZero + lineSpacing:0 + interitemSpacing:0 + headerHeight:0 + items:@[ + [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(33, 33)], + [[IGLayoutTestItem alloc] initWithSize:CGSizeMake(65, 33)], + ]], + ]]; + XCTAssertNil([self.layout layoutAttributesForItemAtIndexPath:quickPath(0, 4)]); +} + @end