Subclassing UICollectionViewLayout and assign to UICollectionView

ios, uicollectionview

Solution

Edit: I didn't notice that you've solved your case, but I had the same problem and here's what helped in my case. I'm leaving it here, it may be useful for someone given that there's not much on this topic yet.

Upon drawing, `UICollectionView` does not call the method `layoutAttributesForItemAtIndexPath:` but `layoutAttributesForElementsInRect:` to determine which cells should be visible. It's your responsibility to implement this method and from there call `layoutAttributesForItemAtIndexPath:` for all visible index paths to determine exact locations.

In other words, add this to your layout:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSMutableArray * array = [NSMutableArray arrayWithCapacity:16];
    // Determine visible index paths
    for(???) {
        [array addObject:[self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:??? inSection:???]]];
    }
    return [array copy];
}

Problem

I have a CollectionViewController ``` - (void)viewDidLoad { [super viewDidLoad]; // assign layout (subclassed below) self.collectionView.collectionViewLayout = [[CustomCollectionLayout alloc] init]; } // data source is working, here's what matters: - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath { ThumbCell *cell = (ThumbCell *)[cv dequeueReusableCellWithReuseIdentifier:@"ThumbCell" forIndexPath:indexPath]; return cell; } ``` I also have a UICollectionViewLayout subclass: CustomCollectionLayout.m ``` #pragma mark - Overriden methods - (CGSize)collectionViewContentSize { return CGSizeMake(320, 480); } - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { return [[super layoutAttributesForElementsInRect:rect] mutableCopy]; } - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { // configure CellAttributes cellAttributes = [super layoutAttributesForItemAtIndexPath:indexPath]; // random position int xRand = arc4random() % 320; int yRand = arc4random() % 460; cellAttributes.frame = CGRectMake(xRand, yRand, 150, 170); return cellAttributes; } ``` I'm trying to use a new frame for the cell, just one at a random position. The problem is layoutAttributesForItemAtIndexPath is not called. Thanks in advance for any advice.

Original source