我需要制作Pinterest风格的新闻源。我创建了一个包含2列的集合视图。我正在下载cellForItemAtIndexPath中的照片async:
- (UICollectionViewCell *)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath {
TFNewsObject *obj = [self.sortedDataSource objectAtIndex:indexPath.row];
[imageView sd_setImageWithURL:url placeholderImage:nil options:SDWebImageRefreshCached
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
obj.tfImage = image;
}];
return cell;
}
问题是我需要在heightForItemAtIndexPath中设置单元格的大小,并且尚未下载图像,因为它还没有输入cellForItemAtIndexPath。我为高度设置了固定大小100。 我在cellforItemAtIndexPath中下载了图像后,我需要以某种方式触发heightForItemAtIndexPath。
我尝试过的另一件事是在heightForItemAtIndexPath同步下载图像并在下载图像后计算高度。以这种方式,它根据图像正确显示每个具有不同高度的单元格,但是加载所有图像需要永远。
我下载图片后有没有办法修改单元格的高度?谢谢!
答案 0 :(得分:0)
在- (UICollectionViewCell *)collectionView:(UICollectionView*)collectionView cellForItemAtIndexPath:(NSIndexPath*)indexPath {
TFNewsObject *obj = [self.sortedDataSource objectAtIndex:indexPath.row];
[imageView sd_setImageWithURL:url placeholderImage:nil options:SDWebImageRefreshCached
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
[self.collectionView.collectionViewLayout invalidateLayout];
}];
return cell;
}
中,当图像将其加载到哈希表中时,您应该使用当前图像路径调用- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return /* size */;
}
。这将重新加载单元格,从而使CollectionView检查单元格的大小。
另一种解决方案是在下载图片时使集合视图布局无效。
{{1}}
在委托方法中返回适当的大小后:
{{1}}
答案 1 :(得分:0)
当我开发类似于pinterest布局的东西时,我遇到了类似的问题。
即使我们在异步下载图像时出现延迟,一旦下载完成,逐个单元格的刷新会让用户感到震惊并导致UI混蛋。
我建议的解决方案是,
例如,当使用图像创建帖子时,计算图像的大小(宽度和高度)并将其保存在数据库中。因此,在下载或缓存图像之前,图像的大小是可用的,我们可以将单元格缩放到图像的高度并显示默认图像,当实际图像被缓存或下载时,它将无声地替换默认图像UI混蛋。
如果您使用的是像cloudinary这样的服务,那么您可以避免存储图像大小(高度和宽度)的痛苦。 cloudinary api将为您提供图像的高度和宽度。