web-dev-qa-db-ja.com

内部の画像がダウンロードされた後、UICollectionViewセルのサイズを変更します

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のサイズを変更する正しいアプローチは何ですか?

14
Fmessina

画像が戻ってきたときに、アニメーションブロックのコレクションビューレイアウトを無効にできるはずです。複数の画像が一度に完成する場合、状況は少し複雑になる可能性がありますが、これは機能するはずです。

[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 */;
}
27
Ash Furrow

コレクションビューセルのサイズを変更するには、コレクションビューを再読み込みして、コレクションビューセルのサイズをメソッドで動的に返すことができます。

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

セルのサイズが動的である場合は、インデックスパスからセルを取得し、画像のサイズに基づいてそのサイズを返します。私は通常、上記の例のように、セルが動的サイズを返すためのメソッドを作成します。 UIImageのsizeプロパティを使用して、画像に基づいてサイズを返すことができます。

1
Chris

ロードが完了したセルに対してreloadItemsAtIndexPaths:を試みることができます。

0
Rivera