Search code examples
iosxcodeuicollectionviewuicollectionviewcell

UICollectionView's cell disappearing


What's happening

Currently I have an application that uses two UICollectionViews inside a UITableView. This way I create a Pulse News look like application. My problem with this is that sometimes the 6th and 11th row disappears completely, leaving a blank space where it should be the cell. I wouldn't actually mind, if all the cells were like this (and this way I could assume that I wasn't doing things correctly), but the thing is, is just happening with those specific ones.

My theory

The 6th and 11th rows are the ones that appears when I start scrolling, so by default I am able to see 5 cells, and when I do the first horizontal scrolling the 6th comes up (blank space sometimes).

What I have

The only thing I am doing at the moment is this:

 [self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];

On the viewDidLoad. And on the creation of the cell:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]];

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController];

    return cell;
}

So on my understating nothing fancy going on here. I though there was something wrong on the data source (a dummy JSON file), but sometimes it works ok and the cell shows, so I guess from that part is ok.

So my "question": Does anyone knows what's going on? I don't really like to say that it's a bug from iOS, but I can't think of anything else.


Edit 1.0

The amazing part is that this method

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

Is going from indexPath [0,4] to [0,6] without calculating the [0,5]. First time I actually see this happening in iOS.


Edit 2.0

I have switched the way I am creating the cells, and instead of dequeuing I am using the old way:

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil];
MyCell *cell = (MyCell *)[nib objectAtIndex:0];

Still the same sad result.


Solution

  • So, what did work?

    1) Subclass UICollectionViewFlowLayout.

    2) Set the flowLayout of my UICollectionView to my new subclass.

    3) On the init method of the UICollectionViewFlowLayout subclass, set the orientation you want:

    self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    

    In my case it is Horizontal.

    4) The important part:

    -(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
    {
       return YES;
    }
    

    At this moment, I should theorise a bit, but honestly I don't have a clue.