UICollectionView with dynamic cell content - get cell to remember state
ios, uicollectionview
Solution
As @iphonic said, the `isBookable` property should be (re)moved from the cell completely. Cells in a UICollectionView are being reused most of the time, so even though your saleImage.isBookable is in the correct state your cell.isBookable is probably not.
I would do the following:
if(saleImage.isBookable){
self.bgImageView.frame = CGRectMake(0, 0, 140, self.bounds.size.height - self.book.bounds.size.height);
cell.bgImageView.image = [UIImage imageNamed:saleImage.imageName];
cell.book.hidden = NO;
}
else{
self.bgImageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
cell.bgImageView.image = nil;
cell.book.hidden = YES;
}
[cell layoutIfNeeded];
inside `collectionView: cellForItemAtIndexPath:`.
I would also have finished setting up the book `UILabel` inside initWithFrame and have it initially hidden. Something like:
- (id)initWithFrame:(CGRect)frame{
self.layer.cornerRadius = 6.0;
self.bgImageView = [[UIImageView alloc] init];
[self.contentView insertSubview:self.bgImageView atIndex:0];
self.book = [[UILabel alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 41, 140, 41)];
self.book.text = @"Book this Item";
self.book.textColor = [UIColor whiteColor];
self.book.adjustsFontSizeToFitWidth=YES;
self.book.textAlignment = NSTextAlignmentCenter;
self.book.backgroundColor= [UIColor darkGrayColor];
self.book.font = [UIFont fontWithName:kAppFont size:17.0];
self.book.hidden = YES;
[self.contentView insertSubview:self.book atIndex:2];
}
Then you would not need to override `layoutSubviews`.
Hope that helps.
Problem
I have a `UICollectionView` that contains dynamic content. The problem I am having is that when the cell is `dequeued` it forgets its state. In my `- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath` I have a boolean value that when it is true, it changes to a true image, but when it is false, it changes to a false image. However when I scroll down and back up, the cells forget there state. Is there a way to make a cell remember its state? Here is what is inside my ``` - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath SalesCollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath]; SaleImage * saleImage = [self.SaleObjs objectAtIndex:indexPath.row]; cell.bgImageView.image = [UIImage imageNamed:saleImage.imageName]; if (saleImage.isBookable) { cell.isBookable = YES; } else{ cell.isBookable=NO; } return cell; } ``` I have a remedy for this but it effects performance. I add this to my custom cell; ``` -(void)prepareForReuse{ [super prepareForReuse]; [self setNeedsLayout]; } ``` Here is my collection view cell; ``` @implementation SalesCollectionViewCell - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code self.layer.cornerRadius = 6.0; self.bgImageView = [[UIImageView alloc] init]; self.book = [[UILabel alloc] init]; [self.contentView insertSubview:self.bgImageView atIndex:0]; return self; } -(void)layoutSubviews{ [super layoutSubviews]; if (self.isBookable) { self.book.frame =CGRectMake(0, self.bounds.size.height - 41, 140, 41); self.book.text = @"Book this Item"; self.book.textColor = [UIColor whiteColor]; self.book.adjustsFontSizeToFitWidth=YES; self.book.textAlignment = NSTextAlignmentCenter; self.book.backgroundColor= [UIColor darkGrayColor]; self.book.font = [UIFont fontWithName:kAppFont size:17.0]; [self.contentView insertSubview:self.book atIndex:2]; self.bgImageView.frame =CGRectMake(0, 0, 140, self.bounds.size.height - self.book.bounds.size.height); } else{ self.bgImageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); } } -(void)prepareForReuse{ [super prepareForReuse]; [self.book removeFromSuperview]; [self setNeedsLayout]; } ```