你好,我有一个问题,如果可能的话,我会非常感谢任何帮助。我有一个应用程序,它有一个UICollectionView,它使用一个UICollectionViewCell,里面有一个UIImageView。每次使用适当的图像生成单元格时,应该设置此图像视图。但是,如果我在图像视图上执行initWithImage,并且我尝试设置的图像数据有效,那么图像就不会出现,但每次重复使用单元格时,新的图像视图都会停留在那里。
以下是代码:
@interface collectionViewController : UICollectionViewController
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
@property (strong, nonatomic) NSMutableArray *imageURLs;
@end
@interface collectionViewController ()
@property (strong, nonatomic) UIImage *cachedImage;
@end
@implementation collectionViewController
@synthesize imageURLs = _imageURLs; @synthesize cachedImage =_cachedImage;
- (void)viewDidLoad {
[super viewDidLoad]; // Do any additional setup after loading the view.
// Register reusable cell for controller
[self.collectionView registerClass:[collectionViewCell class] forCellWithReuseIdentifier:@"Image Cell"];
//Set url for images
_imageURLs = [@[@"http://www.bestcssvault.com/installation/wpcontent/themes/cssvault/gallery/2012/02/daniel_designer-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2012/02/595x400hngry-265x180.png",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2012/02/licron-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2012/02/media-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2012/02/alio-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2012/02/zdravkomecava-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2011/12/guidepiscine_dot_com-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2011/12/web6-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2011/12/CSSVault_Transics-thumb-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2011/12/screen3-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2011/12/divaoffice595x400-265x180.jpg",
@"http://www.bestcssvault.com/installation/wp-content/themes/cssvault/gallery/2011/12/screenshot-265x180.jpg"] mutableCopy]; }
-(NSInteger)numberOfSectionsInCollectionView: (UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return _imageURLs.count;
}
-(collectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"Image Cell";
collectionViewCell *imageCollectionCell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
int row = [indexPath row];
if(imageCollectionCell.imageCollectionView) NSLog(@"worked at %d", row);
//Get Image Data
NSURL * imageURL = [NSURL URLWithString:_imageURLs[row]];
dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL);
dispatch_async(downloadQueue, ^{
NSData * imgData = [NSData dataWithContentsOfURL:imageURL];
dispatch_async(dispatch_get_main_queue(), ^{
UIImage * imageCompleted = [UIImage imageWithData:imgData];
imageCollectionCell.inspirationImage = imageCompleted;
//imageCollectionCell.imageCollectionView.image = imageCompleted;
//NSLog(@"width = %f, height = %f", imageCompleted.size.width, imageCompleted.size.height);
});
});
imageCollectionCell.backgroundColor = [UIColor grayColor]; //dispatch_release(downloadQueue);
return imageCollectionCell;
}
@end
@interface collectionViewCell : UICollectionViewCell
@property (weak,nonatomic) IBOutlet UIImageView *imageCollectionView;
@property (weak,nonatomic) UIImage *inspirationImage;
@end
@implementation collectionViewCell
@synthesize imageCollectionView =_imageCollectionView;
@synthesize inspirationImage = _inspirationImage;
-(void)setImageCollectionView:(UIImageView *)imageCollectionView{
//imageCollectionView = [[UIImageView alloc] initWithFrame:self.frame];
//[self.contentView addSubview:imageCollectionView];
if(!_imageCollectionView){
_imageCollectionView = imageCollectionView;
}
_imageCollectionView.image = _inspirationImage; }
-(void)setInspirationImage:(UIImage *)inspirationImage {
if(!_inspirationImage){
_inspirationImage = inspirationImage;
}
//_imageCollectionView.image = inspirationImage;
self.imageCollectionView.image = _inspirationImage; }
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code
self.backgroundColor = [UIColor whiteColor];
}
return self;
}
- (void)prepareForReuse {
[super prepareForReuse];
//_inspirationImage = [[UIImage alloc] init];
}
/* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@end
任何帮助将不胜感激:)
答案 0 :(得分:0)
我有另一种方法。
首先将图像异步下载到另一个图像数据数组中。
然后在-collectionView:cellForItemAtIndexPath:
内,检查是否已下载该图像(如果尚未下载,则设置为nil;已下载将nil替换为图像数据)
如果已下载,请设置图像,否则设置为另一个“默认”图像。
您可能还需要参考图像视图,以便在下载图像时更新图像。
答案 1 :(得分:0)
问题出在UIImageView中。如果在显示单元格时ImageView的图像为零,则在设置图像时将不会显示该图像。有两种解决方案。 1)创建单元格时设置默认图像。
static NSString *cellIdentifier = @"Image Cell";
collectionViewCell *imageCollectionCell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
UIImage * placeholderImage = [UIImage imageNamed:@"placeholder"];
imageCollectionCell.inspirationImage = placeholderImage;
2)更新图像后,在单元格上调用setNeedsLayout。
dispatch_async(dispatch_get_main_queue(), ^{
UIImage * imageCompleted = [UIImage imageWithData:imgData];
imageCollectionCell.inspirationImage = imageCompleted;
[cell setNeedsLayout];