从 Xamarin / C# 中的 URL 加载的 UIImage
Posted
技术标签:
【中文标题】从 Xamarin / C# 中的 URL 加载的 UIImage【英文标题】:UIImage loaded from URL in Xamarin / C# 【发布时间】:2013-07-23 04:23:20 【问题描述】:this question 得到this blog post 的答复已经 4 年了。
是否有一种标准方法可以使用来自 URL 的图像创建 UIImage?比如:
UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");
我觉得我可能错过了一些非常简单的东西。
【问题讨论】:
【参考方案1】:不是单行,但您可以自己滚动几行。例如
static UIImage FromUrl (string uri)
using (var url = new NSUrl (uri))
using (var data = NSData.FromUrl (url))
return UIImage.LoadFromData (data);
调用,包括来自UIImage
的调用,都是线程安全的。
【讨论】:
当我使用 google.ca/images/srpr/logo11w.png 之类的 url 尝试此操作时,我得到“无法初始化 'MonoTouch.Foundation.NSUrl' 类型的实例:本机 'initWithString:' 方法返回 nil。”知道为什么会这样吗?NSUrl
将抛出(在 ObjC 中返回 nil
)然后提供的 URL 无效(不符合 RFC 2396)。见苹果文档@developer.apple.com/library/ios/documentation/Cocoa/Reference/…:【参考方案2】:
有了新的等待/异步支持,您可以:
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");
【讨论】:
byte[] 内容 = 等待 httpClient.GetByteArrayAsync (imageUrl);【参考方案3】:您要确保异步加载图像,以免阻塞 UI 线程。 MonoTouch.Dialog 包含一个您可以使用的ImageLoader(参见第 5.3 节)类。
还有一些UrlImageStore 的变体可以帮助异步加载图像。
最后,如果您想手动操作,可以使用Xamarin Recipe。
【讨论】:
【参考方案4】:我尝试了上述方法,这看起来是个好主意,但我得到了:
无法隐式转换类型System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to
Monotouch.UIKit.UIImage'
[找到解决方案] 问题是因为 obj.Image = 等待 this.LoadImage (imageUrl) 还必须在标记为异步的方法中。 然后就可以了!
谢谢
【讨论】:
【参考方案5】:下面的代码应该可以工作,
public static async Task<UIImage> LoadImage(string imageUrl)
var httpClient = new HttpClient();
var contents = await httpClient.GetByteArrayAsync(imageUrl);
return UIImage.LoadFromData(NSData.FromArray(contents));
【讨论】:
以上是关于从 Xamarin / C# 中的 URL 加载的 UIImage的主要内容,如果未能解决你的问题,请参考以下文章
C# 文件(CodeBehind 类)从 Visual Studio 中的项目中消失 - Xamarin
关于使用 C#(Xamarin 开发环境)从浮点矩阵转换为 Java.Lang.Object 的问题
如何从 Xamarin MacOS 开发中的另一个 C# 文件更新 ViewController.cs 中的“标签”?
如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串