UICollectionView with dynamic height not getting same space between cell

ios, ipad, objective-c, uicollectionview, uicollectionviewcell

Solution

I've got the general solution for this kind of problem:

- (void)viewDidLoad
{
    [super viewDidLoad];

    [cView registerNib:[UINib nibWithNibName:@"CViewCell" bundle:nil] forCellWithReuseIdentifier:kCellID];

    CViewFlowLayout *fl = [[CViewFlowLayout alloc] init];
    fl.minimumInteritemSpacing = 10;
    fl.scrollDirection = UICollectionViewScrollDirectionVertical;
    self.cView.collectionViewLayout = fl;

    NSString *strJson = MY FUNCTION WHICH RETURNS JSON STRING;
    SBJSON *parser = [[SBJSON alloc] init];

    self.arrMain = [[NSMutableArray alloc] init];
    self.arrMain = [parser objectWithString:strJson error:nil];
    for (int i=0; i<[self.arrMain count]; i++) {
    NSDictionary *dic = [self.arrMain objectAtIndex:i];
    [self setTags:[[UIView alloc] init] selDictionary:dic];  // This function generates height and save it to the dictionary
}
    [cView reloadData];

}

Then, update the code in CViewFlowLayout.m, which is a subclass of `UICollectionViewFlowLayout`.

Here is the code:

#define numColumns 3
@implementation CViewFlowLayout
@synthesize numOfColumnsToDisplay;
- (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];

    if (indexPath.item < numColumns){
        CGRect f = currentItemAttributes.frame;
        f.origin.y = 0;
        currentItemAttributes.frame = f;
        return currentItemAttributes;
    }
    NSIndexPath* ipPrev = [NSIndexPath indexPathForItem:indexPath.item-numColumns inSection:indexPath.section];
    CGRect fPrev = [self layoutAttributesForItemAtIndexPath:ipPrev].frame;
    CGFloat YPointNew = fPrev.origin.y + fPrev.size.height + 10;
    CGRect f = currentItemAttributes.frame;
    f.origin.y = YPointNew;
    currentItemAttributes.frame = f;
    return currentItemAttributes;
}

This solution will work for vertical scrolling only. If you want to display more or less columns, just change the `numColumns`.

Problem

I am having similar problem like this I am generating height of view at run time.Here is my code ``` @interface CollectionViewController () { NSMutableArray *arrMain; } @property(nonatomic,strong) NSMutableArray *arrMain; @end @implementation CollectionViewController @synthesize arrMain, - (void)viewDidLoad { [super viewDidLoad]; [cView registerNib:[UINib nibWithNibName:@"CViewCell" bundle:nil] forCellWithReuseIdentifier:kCellID]; CViewFlowLayout *fl = [[CViewFlowLayout alloc] init]; self.cView.collectionViewLayout = fl; NSString *strJson = MY FUNCTION WHICH RETURNS JSON STRING; SBJSON *parser = [[SBJSON alloc] init]; self.arrMain = [[NSMutableArray alloc] init]; self.arrMain = [parser objectWithString:strJson error:nil]; for (int i=0; i<[self.arrMain count]; i++) { NSDictionary *dic = [self.arrMain objectAtIndex:i]; [self setTags:[[UIView alloc] init] selDictionary:dic]; // This function generates height and save it to the dictionary } [cView reloadData]; } - (NSInteger)collectionView:(UICollectionView *)view numberOfItemsInSection:(NSInteger)section; { return [self.arrMain count]; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { NSDictionary *dic = [self.arrMain objectAtIndex:indexPath.row]; return CGSizeMake(236,40+[[dic valueForKey:@"TAGS_HEIGHT"] intValue]); } - (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath; { CViewCell *cell =(CViewCell *) [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath]; NSDictionary *dic = [self.arrMain objectAtIndex:indexPath.row]; if ([cell viewWithTag:11]){ [[cell viewWithTag:11] release]; [[cell viewWithTag:11] removeFromSuperview]; } UIView *viewTags = [[UIView alloc] init]; [viewTags setTag:11]; [viewTags setBackgroundColor:[UIColor lightGrayColor]]; [self setTags:viewTags selDictionary:dic]; [viewTags setFrame:CGRectMake(5, 10, CONTENT_WIDTH, [[dic valueForKey:@"TAGS_HEIGHT"] floatValue])]; [cell.contentView addSubview:viewTags]; return cell; } ``` I had tried above link solution but it is not working for me. Here is an image of my output. I need the spacing to be same. Is anyone having solution for this issue ? Is this bug of UICOllectionView ? Because I found this issue in this article also.

Original source

Related problems