アプリでMonoTouch.Dialogを使用しています。ただし、問題のフォームは、TableViewを追加したUIViewControllerを使用して実装されます(したがって、UIToolbarを追加することもできます)。
私はMonoTouch.Dialog.Utilitiesに含まれているImageLoaderが大好きで、TableViewのDataSourceのGetCell()メソッドでそれを使用してURLから画像をレンダリングしようとしています。
var callback = new ImageLoaderCallback(controller, cell.ImageView, indexPath); // ImageLoaderCallback implements IImageUpdated
cell.ImageView.Image = ImageLoader.DefaultRequestImage(new Uri(picFV.Value), callback);
問題は、URLがダウンロードされるまで、ImageViewのスペースが折りたたまれていることです(そのため、画像の右側のテキストは実際にはテーブルの左側に固定されています)。
ダウンロードした画像と同じサイズの一時的なローカル画像を表示して、ImageLoaderが画像の取得とレンダリングを完了したときに、ユーザーエクスペリエンスがそれほど不快にならないようにします。
GetCell()呼び出しで次のことを実行しようとしました... cell.ImageView.Imageが他の画像(以下には表示されていません)に設定され、ImageLoader.DefaultRequestImageから返されるものへの参照を取得します。
var image = ImageLoader.DefaultRequestImage(new Uri(picFV.Value), callback);
callback.Image = image;
最後の行は、ImageLoaderによって返された画像参照をコールバックの状態に詰め込み、ImageLoaderが完了すると、コールバックがセルのImageView.Imageを置き換えます(以下を参照)。
// callback class for the MonoTouch.Dialog image loader utility
private class ImageLoaderCallback : IImageUpdated
{
private ListViewController controller;
private UIImageView imageView;
private NSIndexPath indexPath;
public ImageLoaderCallback(ListViewController c, UIImageView view, NSIndexPath path)
{
controller = c;
imageView = view;
indexPath = path;
}
public UIImage Image { get; set; }
void IImageUpdated.UpdatedImage(Uri uri)
{
if (uri == null)
return;
if (Image != null)
imageView.Image = Image;
// refresh the display for the row of the image that just got updated
controller.TableView.ReloadRows(new NSIndexPath [] { indexPath }, UITableViewRowAnimation.None);
}
}
ただし、これは機能しません。これは、ImageLoaderがImageViewをレンダリングしようとするときに、TableViewによって「プル」される必要があるように見えるためです(つまり、誰もURLをプルしていないため、ImageLoaderコールバックが呼び出されることはありません)。
このシナリオを達成するにはどうすればよいですか?
ありがとう!