画像の非同期ロード
前回の内容とも関わるのですが、UITableViewCellの画像をWEBからロードする場合も、スクロールが非常に重くなることがあります。
前回同様、配列を使って回避できるかなと思ったのですが、うまく表示させることができませんでした。(もし方法があればご教示頂けると幸いです!)
そこで、画像は非同期通信でロードし、ロードできたものから順次表示されるようにしました。
環境
- iPhoneSDK 3.1.3
方法はこちらのページを参考にさせて頂きました。
非同期通信で画像をロードする方法について - プログラミングノート
大まかな流れとしては、UIImageViewを継承したクラスを作成し、そのクラスに画像データのロードを行わせ、cell.imageViewにaddSubviewする形となります。
ただ、私の環境で試したところ、addSubviewだけでは表示されなかった(cell.imageView.imageが確保されていない感じ)ため、下記のようにデフォルト画像を明示的に指定しました。
// tableView:cellForRowAtIndexPath UIAsyncImageView *ai = [[UIAsyncImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; [ai loadImage:@"URL"]; [cell.imageView addSubview:ai]; cell.imageView.image = [UIImage imageNamed:@"NoPhoto.png"]; // デフォルト画像を明示的に指定
また、これだけですと、スクロールしてセルが再利用されたとき、新しい画像がロードされるまで古い画像が残っていて違和感がありました。
そこで、UIAsyncImageView.mにinitWithFrameを定義し、セル再利用時もデフォルト画像にリセットされるようにしました。
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.image = [UIImage imageNamed:@"NoPhoto.png"]; // セル再利用時にもこのメソッドが呼ばれるため、画像をリセット } return self; }