在Objective C中动态修改UICollectionViewCell中单元格的高度

时间:2017-05-12 10:15:03

标签: ios objective-c asynchronous uicollectionview uicollectionviewcell

我需要制作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同步下载图像并在下载图像后计算高度。以这种方式,它根据图像正确显示每个具有不同高度的单元格,但是加载所有图像需要永远。

我下载图片后有没有办法修改单元格的高度?谢谢!

2 个答案:

答案 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将为您提供图像的高度和宽度。