19

UIImageView+AFNetworking非同期の画像読み込みにカテゴリを使用しています。すべて正常に動作しますが、いくつか試してみましたが、ダウンロードした画像に従ってセルの高さを変更するときに成功しませんでした。画像をセルの幅に合わせて高さを変更したいのですが、それを達成する方法がわかりません。画像がダウンロードされた行をリロードしようとしましたが、それにより がcellForRowAtIndexPath再び起動し、すべてが再設定されます。ほぼ再帰です。

新しい画像サイズの差を計算して保存しNSMutableArray、UIImageView の成功ブロックに行をリロードしていsetImageWithURLRequest:placeholderImage:success:ます。

いくつかの行の正しい高さを取得しますheightForRowAtIndexPathが、その後、テーブルが奇妙に動作し始め、すべてがオーバーレイされます。

何か案は?

ありがとう!

編集

私は最終的にエゼキの答えを使いました。また、このトピックに関する記事を書き、この手法を使用するサンプル アプリを作成しました。

ここでチェックしてください

4

2 に答える 2

19

ダウンロードした画像をメモリまたはディスクに保存する必要があるため、次回この URL から画像を取得しようとすると、キャッシュから取得されます。

したがって、それを行う場合は、次のようなことを行う必要があります。

[tableView beginUpdates];

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

[tableView endUpdates];

また、テーブル ビュー データ ソースのこのメソッドで新しいセルの高さを返す必要があります。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

代わりにSDWebImage ライブラリを使用することをお勧めしますAFNetworking。これは、イメージを memcache とディスクにキャッシュでき、非常に使いやすいためです。したがって、それを使用することにした場合、ダウンロード画像のコードは次のようになります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"]
           placeholderImage:[UIImage imageNamed:@"placeholder.png"]
                    success:^(UIImage *image, BOOL cached) {

                        // save height of an image to some cache
                        [self.heightsCache setObject:[NSNumber numberWithFloat:imHeight] 
                                              forKey:urlKey];

                        [tableView beginUpdates];
                        [tableView reloadRowsAtIndexPaths:@[indexPath]
                                         withRowAnimation:UITableViewRowAnimationFade];
                        [tableView endUpdates];
                    }
                    failure:^(NSError *error) {... failure code here ...}];

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    // try to get image height from your own heights cache
    // if its is not there return default one
    CGFloat height = [[self.heightsCache objectForKey:urlKeyFromModelsArrayForThisCell] floatValue];
    ...
    return newHeight;
}
于 2012-10-27T23:52:07.207 に答える