27

这篇博文回答这个问题已经 4 年了。

是否有一种标准方法可以使用来自 URL 的图像创建 UIImage?就像是:

UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");

我觉得我可能错过了一些非常简单的东西。

4

5 回答 5

58

不是单行,但您可以自己滚动几行。例如

static UIImage FromUrl (string uri)
{
    using (var url = new NSUrl (uri))
    using (var data = NSData.FromUrl (url))
        return UIImage.LoadFromData (data);
}

这些调用,包括来自 的调用,UIImage都是线程安全的。

于 2013-07-24T00:15:34.300 回答
27

使用新的等待/异步支持,您可以:

public async Task<UIImage> LoadImage (string imageUrl)
        {
            var httpClient = new HttpClient();

            Task<byte[]> contentsTask = httpClient.GetByteArrayAsync (imageUrl);

            // await! control returns to the caller and the task continues to run on another thread
            var contents = await contentsTask;

            // load from bytes
            return UIImage.LoadFromData (NSData.FromArray (contents));
        }

你称之为:

someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url");
于 2013-10-18T22:45:06.097 回答
5

您要确保异步加载图像,以免阻塞 UI 线程。MonoTouch.Dialog 包含一个您可以使用的ImageLoader(参见第 5.3 节)类。

还有一些UrlImageStore的变体可以帮助异步加载图像。

最后,如果您想手动操作,可以使用Xamarin 食谱。

于 2013-07-23T21:34:18.900 回答
1

我尝试了上述方法,这看起来是个好主意,但我得到:无法隐式转换类型System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' toMonotouch.UIKit.UIImage'

[找到解决方案] 问题是因为
obj.Image = await this.LoadImage (imageUrl) 也必须在标记为 async 的方法中。然后它起作用了!

谢谢

于 2014-01-09T02:40:31.623 回答
0

下面的代码应该可以工作,

public static async Task<UIImage> LoadImage(string imageUrl)
{
            var httpClient = new HttpClient();

            var contents = await httpClient.GetByteArrayAsync(imageUrl);
            return UIImage.LoadFromData(NSData.FromArray(contents));
}
于 2019-12-16T13:36:01.827 回答