UICollectionView's cell disappearing

36,886

Solution 1

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.

Solution 2

The above answers didn't work for me, but after downloading the images, I replaced the code [self.myCollectionView reloadData] with [self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; to refresh the collectionview and it shows all cells, you can try it.

Solution 3

None of the solutions given by anyone helped me in my custom layout that we need to have in our app. Instead, I had to do this: (And yeah, IT WORKS!!!)

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
    CGSize size = [self collectionViewContentSize];
    rect.size.height = size.height*2;
    NSArray *atrributes_Super = [super layoutAttributesForElementsInRect:rect];
    return atrributes_Super;
}

After all, UICollectionView is just looking for the attributes for the elements to be displayed in your screen's rect.

Solution 4

Rob's tip about the bug helped me. The bug states that if the section insets and cells widths and spacing add up exactly to the width of the screen then the first column sometimes randomly dissappears and reappears for some cells in some places. Rather than subclass or change the cell widths, I changed the section insets for left and right in my storyboard from 6 to 4 and it I haven't seen the problem again.

Solution 5

In my case (vertical scroll, with cells disappearing in first view), cells were disappearing due to incorrect estimated size. It seems, UICollectionView uses the estimated size to calculate the items to load in first view. I'd set the estimated size too high which was resulting in wrong calculations for number of items to load in first screen.

The moment I made the estimated height bit low, all the cells appeared correctly.

Share:
36,886
Rui Peres
Author by

Rui Peres

The cake is a lie You can also find me here: ruiper.es.

Updated on March 17, 2021

Comments

  • Rui Peres
    Rui Peres about 3 years

    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.