UICollectionView
を作成していますが、カスタムセルには2つのラベルと1つの画像が含まれます。
各画像は非同期でダウンロードされるため、ダウンロードが完了するまでサイズはわかりません。ダウンロードしたら、ダウンロードしたばかりの画像の高さに合うように、コンテンツとフレームを再レイアウトするように各セルを調整したいと思います。
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
のサイズを変更する正しいアプローチは何ですか?
画像が戻ってきたときに、アニメーションブロックのコレクションビューレイアウトを無効にできるはずです。複数の画像が一度に完成する場合、状況は少し複雑になる可能性がありますが、これは機能するはずです。
[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 */;
}
コレクションビューセルのサイズを変更するには、コレクションビューを再読み込みして、コレクションビューセルのサイズをメソッドで動的に返すことができます。
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
return [cell size];
}
セルのサイズが動的である場合は、インデックスパスからセルを取得し、画像のサイズに基づいてそのサイズを返します。私は通常、上記の例のように、セルが動的サイズを返すためのメソッドを作成します。 UIImageのsizeプロパティを使用して、画像に基づいてサイズを返すことができます。
ロードが完了したセルに対してreloadItemsAtIndexPaths:
を試みることができます。