我在我的应用程序中使用 MonoTouch.Dialog;但是,有问题的表单是使用 UIViewController 实现的,我在其中添加了 TableView(因此我也可以添加 UIToolbar)。
我喜欢 MonoTouch.Dialog.Utilities 中的 ImageLoader,并尝试在 DataSource 的 GetCell() 方法中使用它,以便 TableView 从 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“拉动”(即 ImageLoader 回调永远不会被调用,因为没有人拉动 URL)。
我该如何完成这个场景?
谢谢!