diff --git a/.gitignore b/.gitignore index c67c252..ac781e5 100644 --- a/.gitignore +++ b/.gitignore @@ -19,5 +19,5 @@ profile DerivedData # Demo Images -FastImageCache/FastImageCacheDemo/Demo Images/*.jpg +FastImageCacheDemo/Demo Images/*.jpg Carthage diff --git a/FastImageCache/FastImageCacheDemo/Classes/FICDPhotosTableViewCell.m b/FastImageCache/FastImageCacheDemo/Classes/FICDPhotosTableViewCell.m index 5c7c29d..eaa24c3 100644 --- a/FastImageCache/FastImageCacheDemo/Classes/FICDPhotosTableViewCell.m +++ b/FastImageCache/FastImageCacheDemo/Classes/FICDPhotosTableViewCell.m @@ -19,7 +19,7 @@ @interface FICDPhotosTableViewCell () { NSArray *_photos; NSString *_imageFormatName; - NSArray *_imageViews; + NSMutableArray *_imageViews; UITapGestureRecognizer *_tapGestureRecognizer; } @@ -39,28 +39,42 @@ @implementation FICDPhotosTableViewCell - (void)setPhotos:(NSArray *)photos { if (photos != _photos) { _photos = [photos copy]; - - for (NSInteger i = 0; i < [_imageViews count]; i++) { + + // Either create the image views for this cell or clear them out if they already exist + if (_imageViews == nil) { + NSInteger photosPerRow = [[self class] photosPerRow]; + _imageViews = [[NSMutableArray alloc] initWithCapacity:photosPerRow]; + + for (NSInteger i = 0; i < photosPerRow; i++) { + UIImageView *imageView = [[UIImageView alloc] init]; + [imageView setContentMode:UIViewContentModeScaleAspectFill]; + [_imageViews addObject:imageView]; + } + } else { + for (UIImageView *imageView in _imageViews) { + [imageView setImage:nil]; + [imageView removeFromSuperview]; + } + } + + NSInteger photosCount = [_photos count]; + for (NSInteger i = 0; i < photosCount; i++) { + FICDPhoto *photo = [_photos objectAtIndex:i]; UIImageView *imageView = [_imageViews objectAtIndex:i]; - - if (i < [_photos count]) { - FICDPhoto *photo = [_photos objectAtIndex:i]; - - if (_usesImageTable) { - [[FICImageCache sharedImageCache] retrieveImageForEntity:photo withFormatName:_imageFormatName completionBlock:^(id entity, NSString *formatName, UIImage *image) { - // This completion block may be called much later. We should check to make sure this cell hasn't been reused for different photos before displaying the image that has loaded. - if (photos == [self photos]) { - [imageView setImage:image]; - } - }]; - } else { - [imageView setImage:[photo thumbnailImage]]; - } + + if (_usesImageTable) { + [[FICImageCache sharedImageCache] retrieveImageForEntity:photo withFormatName:_imageFormatName completionBlock:^(id entity, NSString *formatName, UIImage *image) { + // This completion block may be called much later. We should check to make sure this cell hasn't been reused for different photos before displaying the image that has loaded. + if (photos == [self photos]) { + [imageView setImage:image]; + } + }]; } else { - // Last row might not be full - [imageView setImage:nil]; + [imageView setImage:[photo thumbnailImage]]; } } + + [self setNeedsLayout]; } } @@ -103,18 +117,6 @@ - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reus if (self != nil) { _tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_tapGestureRecognizerStateDidChange)]; [self addGestureRecognizer:_tapGestureRecognizer]; - - NSInteger photosPerRow = [[self class] photosPerRow]; - NSMutableArray *imageViews = [[NSMutableArray alloc] initWithCapacity:photosPerRow]; - - for (NSInteger i = 0; i < photosPerRow; i++) { - UIImageView *imageView = [[UIImageView alloc] init]; - [imageView setContentMode:UIViewContentModeScaleAspectFill]; - [imageViews addObject:imageView]; - [self.contentView addSubview:imageView]; - } - - _imageViews = [imageViews copy]; } return self; @@ -137,12 +139,14 @@ - (void)layoutSubviews { CGFloat outerPadding = [[self class] outerPadding]; CGRect imageViewFrame = CGRectMake(outerPadding, outerPadding, FICDPhotoSquareImageSize.width, FICDPhotoSquareImageSize.height); - + + UIView *contentView = [self contentView]; NSInteger count = [_photos count]; for (NSInteger i = 0; i < count; i++) { UIImageView *imageView = [_imageViews objectAtIndex:i]; [imageView setFrame:imageViewFrame]; + [contentView addSubview:imageView]; imageViewFrame.origin.x += imageViewFrame.size.width + innerPadding; } diff --git a/FastImageCache/FastImageCacheDemo/Classes/FICDViewController.m b/FastImageCache/FastImageCacheDemo/Classes/FICDViewController.m index c81c8bd..f830e87 100644 --- a/FastImageCache/FastImageCacheDemo/Classes/FICDViewController.m +++ b/FastImageCache/FastImageCacheDemo/Classes/FICDViewController.m @@ -95,7 +95,6 @@ - (void)loadView { [_tableView setDelegate:self]; [_tableView setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; [_tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; - [_tableView registerClass:[FICDPhotosTableViewCell class] forCellReuseIdentifier:[FICDPhotosTableViewCell reuseIdentifier]]; CGFloat tableViewCellOuterPadding = [FICDPhotosTableViewCell outerPadding]; [_tableView setContentInset:UIEdgeInsetsMake(0, 0, tableViewCellOuterPadding, 0)]; @@ -462,9 +461,13 @@ - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger) - (UITableViewCell*)tableView:(UITableView*)table cellForRowAtIndexPath:(NSIndexPath*)indexPath { NSString *reuseIdentifier = [FICDPhotosTableViewCell reuseIdentifier]; - FICDPhotosTableViewCell *tableViewCell = (FICDPhotosTableViewCell *)[table dequeueReusableCellWithIdentifier:reuseIdentifier forIndexPath:indexPath]; - tableViewCell.selectionStyle = UITableViewCellSeparatorStyleNone; - + FICDPhotosTableViewCell *tableViewCell = (FICDPhotosTableViewCell *)[table dequeueReusableCellWithIdentifier:reuseIdentifier]; + if (tableViewCell == nil) { + tableViewCell = [[FICDPhotosTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier]; + [tableViewCell setBackgroundColor:[table backgroundColor]]; + [tableViewCell setSelectionStyle:UITableViewCellSelectionStyleNone]; + } + [tableViewCell setDelegate:self]; [tableViewCell setImageFormatName:_imageFormatName];