我在這一整個下午,我無法想象它,所以你的幫助會很棒!我有一個自定義的UICollectionViewCell,裏面填充了我在飛行中創建的圖像。圖像的路徑存儲在分析和查詢完成後,我打電話[self.collectionView reloadData].
如何正確加載自定義UICollectionViewCell上的圖像?
在我cellForItemAtIndexPath我有以下代碼:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
MovieCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];
// Configure the cell
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"original_title" ascending:YES];
[self.moviesforWatchlist sortUsingDescriptors:[NSArray arrayWithObjects:sort, nil]];
cell.userInteractionEnabled = YES;
UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
[cell addSubview:spinner];
NSDictionary *movie = self.moviesforWatchlist[indexPath.row];
NSString *moviePosterPath = movie[@"poster_path"];
NSString *posterURL = [NSString stringWithFormat:@"http://image.tmdb.org/t/p/w342%@", moviePosterPath];
NSURL *posterImage = [NSURL URLWithString:posterURL];
UIImage *cachedImage = [self.imageCache objectForKey:posterImage];
if (cachedImage) {
cell.imageView.image = cachedImage;
}
else if (cell.imageView.image == nil) {
cell.imageView.image = [UIImage imageNamed:@"default_collectionviewcell.jpeg"];
dispatch_queue_t downloadQueue = dispatch_queue_create("get image data", NULL);
dispatch_async(downloadQueue, ^{
[spinner startAnimating];
NSData *imageData = [NSData dataWithContentsOfURL:posterImage];
UIImage *image = [UIImage imageWithData:imageData];
dispatch_async(dispatch_get_main_queue(), ^{
[spinner stopAnimating];
MovieCollectionViewCell *updateCell = (id)[collectionView cellForItemAtIndexPath:indexPath];
if (updateCell) {
updateCell.imageView.image = image;
[updateCell reloadInputViews];
[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];
}
});
[self.imageCache setObject:image forKey:posterImage];
});
}
[self.collectionView reloadItemsAtIndexPaths:[self.collectionView indexPathsForVisibleItems]];
return cell;
}
我打電話這樣的查詢方法:
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self getWatchlistData];
[self.collectionView reloadData];
}
這會導致圖像閃爍,直到圖像加載到UICollectionViewCells。我希望顯示在我的collectionviewcell中的圖像按照字母順序排列,因此我正在排序包含路徑的陣列,在cellforitemsatindexpath
這是什麼導致圖像閃爍?或者是別的什麼?非常感謝您的幫助!
不用擔心!我非常感謝你的反饋。我剛開始學習Objective-C,iOS開發和編程,所以這些答案很棒。我知道我做錯了什麼,但是讓它正常工作仍然取決於我。 關於這個......我認爲它現在正在工作!我在對數組進行排序時,它在getWatchListData方法中填充(這似乎有很大的不同)。基本上,我做了所有的建議。唯一的問題是,在第一次加載時,有時單元格會填充錯誤的圖像。任何想法如何我可以解決這個問題? – bienj0 2014-10-18 10:56:04
只有幾個指針:首先,檢查您的緩存是否正確填充。它可能在之前的運行中被錯誤填充,即使您的代碼現在可能沒問題。其次,注意細胞再利用問題,特別是如果您在滾動列表時看到相同的圖像出現。我發現NSLog和斷點對於追蹤這類問題確實很有幫助。 – pbasdf 2014-10-18 22:48:24