下载图像内部后调整UICollectionView单元格的大小

时间:2014-04-16 22:57:59

标签: ios uicollectionview uicollectionviewcell

我正在构建UICollectionView,我的自定义单元格将包含两个标签和一个图像。

每个图像都是异步下载的,因此在下载完成之前我不知道它的大小。 一旦下载,我想调整每个单元格重新布局它的内容和框架,以适应刚下载的图像的高度。

作为UICollectionViewLayout,我正在使用CHTCollectionViewWaterfallLayout

要异步下载图像我正在使用SDWebImage,如下所示:

    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
                   placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                          completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) 
                                {... some completion code here ...}];

问题:

在下载图片后立即调整每个UICollectionViewCell的正确方法是什么?

3 个答案:

答案 0 :(得分:26)

当图像返回时,您应该能够在动画块中使集合视图布局无效。如果一次完成多个图像完成,事情可能会变得有点复杂,但这应该有效:

[cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
               placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                      completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType)^{
                          [UIView animateWithDuration:0.3f animations:^{
                              [self.collectionView.collectionViewLayout invalidateLayout];
                          }];
                      }];

然后在适当的委托方法中返回不同的大小。

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return /* a different size if the image is done downloading yet */;
}

答案 1 :(得分:1)

要调整集合视图单元格的大小,您可以重新加载集合视图并在方法中动态返回集合视图单元格的大小:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
    return [cell size];
}

如果单元格的大小是动态的,请从索引路径获取单元格,并根据图像的大小返回其大小。我通常为单元格创建一个返回动态大小的方法,如上例所示。您可以使用UIImage的size属性来帮助返回基于图像的大小。

答案 2 :(得分:0)

您可以尝试reloadItemsAtIndexPaths:查看已完成加载的单元格。