我需要根据其中的图像更改uicollectionviewcell高度。但是加载图像需要一些时间并且它在一个单独的线程中。那么我如何以下面的方法返回单元格的高度
- (CGFloat)collectionView:(UICollectionView *)collectionView
layout:(FRGWaterfallCollectionViewLayout *)collectionViewLayout
heightForItemAtIndexPath:(NSIndexPath *)indexPath {
PFObject *image =_media[indexPath.row];
PFFile *userImageFile = image[@"mediaFile"];
int height=nil;
[userImageFile getDataInBackgroundWithBlock:^(NSData *imageData, NSError *error) {
if (!error) {
UIImage *image = [UIImage imageWithData:imageData];
__block height=image.size.height;
}
}];
return height;
}
我知道这种方法不会起作用,因为每次高度都是零。请提示一个有效的解决方案。
答案 0 :(得分:0)
请按照以下步骤来达到您的要求 -
1)在您的模态中,您应该跟踪图像,无论是否已下载。
2)在collectionView:layout:heightForItemAtIndexPath:
中插入支票
如果没有下载图像,则返回默认高度的方法,然后获取image.size.height
并从中计算单元格的高度。
3)在创建集合视图单元项的方法内插入一个检查以查看图像是否可用,如果它可用则设置图像并返回单元格,然后在BackGround线程中安排图像下载,同时返回没有图像的默认单元格。下载图像时切换到主线程,更新与单元格相关的模型数据,以跟踪该单元格的下载图像并重新加载同一单元格的行。
4)在主线程上调用重新加载以重新加载下载图像的单元格会触发相应行的集合视图的数据源方法(即,将再次遵循相应的第2和第3行步骤)。
5)因为在下载图像之后我们更新了模型并调用了重新加载相应单元格的行,所以这次图像在相应行的模态中,因此将相应地计算高度并且单元格将随图像一起返回。
这些只是实现您的要求的步骤,您需要将上述步骤转换为代码。