【发布时间】:2013-07-23 04:23:20
【问题描述】:
this question 得到this blog post 的答复已经 4 年了。
是否有一种标准方法可以使用来自 URL 的图像创建 UIImage?比如:
UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");
我觉得我可能错过了一些非常简单的东西。
【问题讨论】:
标签: c# ios xamarin.ios uiimage xamarin
this question 得到this blog post 的答复已经 4 年了。
是否有一种标准方法可以使用来自 URL 的图像创建 UIImage?比如:
UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");
我觉得我可能错过了一些非常简单的东西。
【问题讨论】:
标签: c# ios xamarin.ios uiimage xamarin
不是单行,但您可以自己滚动几行。例如
static UIImage FromUrl (string uri)
{
using (var url = new NSUrl (uri))
using (var data = NSData.FromUrl (url))
return UIImage.LoadFromData (data);
}
调用,包括来自UIImage 的调用,都是线程安全的。
【讨论】:
NSUrl 将抛出(在 ObjC 中返回 nil)然后提供的 URL 无效(不符合 RFC 2396)。见苹果文档@developer.apple.com/library/ios/documentation/Cocoa/Reference/…:
有了新的等待/异步支持,您可以:
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");
【讨论】:
您要确保异步加载图像,以免阻塞 UI 线程。 MonoTouch.Dialog 包含一个您可以使用的ImageLoader(参见第 5.3 节)类。
还有一些UrlImageStore 的变体可以帮助异步加载图像。
最后,如果您想手动操作,可以使用Xamarin Recipe。
【讨论】:
我尝试了上述方法,这看起来是个好主意,但我得到了:
无法隐式转换类型System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' toMonotouch.UIKit.UIImage'
[找到解决方案]
问题是因为
obj.Image = 等待 this.LoadImage (imageUrl)
还必须在标记为异步的方法中。
然后就可以了!
谢谢
【讨论】:
下面的代码应该可以工作,
public static async Task<UIImage> LoadImage(string imageUrl)
{
var httpClient = new HttpClient();
var contents = await httpClient.GetByteArrayAsync(imageUrl);
return UIImage.LoadFromData(NSData.FromArray(contents));
}
【讨论】: