我正在使用UIImageView+AFNetworking
类别进行异步图片加载。一切正常,但我已经尝试了一些事情,并根据下载的图像调整单元格的高度时没有成功。我希望图像适合单元格的宽度,但调整高度,但我不知道如何实现。我已经尝试重新下载图像下载的行,但这只会导致cellForRowAtIndexPath
再次触发并再次设置所有内容,等等。几乎是一个递归。
我正在计算新的图像大小差异并将其存储在NSMutableArray
中,然后在UIImageView的setImageWithURLRequest:placeholderImage:success:
中重新加载成功块中的行。
我在heightForRowAtIndexPath
中获得了几行的正确高度,但是,表开始表现得很奇怪,一切都在覆盖等等。
有什么想法吗?
谢谢!
修改
我最终使用了Ezeki的答案。我还写了一篇关于这个主题的帖子,并制作了一个使用这种技术的示例应用程序。
在here上查看。
答案 0 :(得分:17)
您需要将下载的图像存储在内存或磁盘上,因此下次尝试从此URL获取图像时,您将从缓存中收到图像。
所以,如果你这样做,你将不得不做这样的事情:
[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
你应该在这个表视图数据源方法中返回新单元格的高度:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
我建议您使用SDWebImage library而不是AFNetworking
,因为它可以为您缓存图像到内存缓存和磁盘,并且它非常易于使用。因此,如果您决定使用它,您的下载图像代码将如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
...
[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
placeholderImage:[UIImage imageNamed:@"placeholder.png"]
success:^(UIImage *image, BOOL cached) {
// save height of an image to some cache
[self.heightsCache setObject:[NSNumber numberWithFloat:imHeight]
forKey:urlKey];
[tableView beginUpdates];
[tableView reloadRowsAtIndexPaths:@[indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
}
failure:^(NSError *error) {... failure code here ...}];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// try to get image height from your own heights cache
// if its is not there return default one
CGFloat height = [[self.heightsCache objectForKey:urlKeyFromModelsArrayForThisCell] floatValue];
...
return newHeight;
}
答案 1 :(得分:0)
对我而言,这有效:
您检查缓存图像是否可用如果可用则将其设置为图像,如果没有,则下载然后通过调用重新加载索引路径重置表格布局。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *broadcastTableCellIdentifier = @"BlockbusterTableViewCell";
BlockbusterTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:broadcastTableCellIdentifier];
if (cell == nil) {
cell = [[BlockbusterTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:broadcastTableCellIdentifier];
}
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
-(void)configureCell:(BlockbusterTableViewCell*)cell atIndexPath:(NSIndexPath*)indexPath{
SportData *data = [self.webShared.arrSportsData objectAtIndex:self.selectedEvent];
BroadcastData *broadcastData = [data.broadcastData objectAtIndex:indexPath.row];
NSURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:broadcastData.image]];
AFImageDownloader *downloader = [UIImageView sharedImageDownloader];
id <AFImageRequestCache> imageCache = downloader.imageCache;
UIImage *cacheimage = [imageCache imageforRequest:urlRequest withAdditionalIdentifier:nil];
if (cell.imgBroadcast.image != cacheimage) {
[cell.imgBroadcast setImageWithURLRequest:urlRequest placeholderImage:[UIImage imageNamed:@"placeholder_smaller"] success:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, UIImage * _Nonnull image) {
cell.imgBroadcast.image = image;
[self.tableViewBroadcast beginUpdates];
[self.tableViewBroadcast reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableViewBroadcast endUpdates];
} failure:^(NSURLRequest * _Nonnull request, NSHTTPURLResponse * _Nullable response, NSError * _Nonnull error) {
}];
}
else{
cell.imgBroadcast.image =cacheimage;
}
cell.lblTitle.text = broadcastData.title;
cell.lblText.text = broadcastData.text;
cell.lblEventDateTime.text = [self eventTime:broadcastData.eventTime];
}