我在我的应用中使用MonoTouch.Dialog;但是,有问题的表单是使用UIViewController实现的,我在其中添加了一个TableView(所以我也可以添加一个UIToolbar)。
我喜欢MonoTouch.Dialog.Utilities中的ImageLoader,并尝试在DataView的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)。
如何完成此方案?
谢谢!
答案 0 :(得分:1)
我知道这是一个古老的问题,但是在搜索同样的事情时我遇到了它,并且看到了以下博客文章,其中说明了如何实现这一目标。我还没有尝试过,但希望它可以帮助你或其他任何人在将来遇到这个问题:http://yusinto.blogspot.co.uk/2012/05/background-image-downloading-with.html