【问题标题】:UIImage loaded from URL in Xamarin / C#从 Xamarin / C# 中的 URL 加载的 UIImage
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

    【解决方案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&lt;MonoTouch.UIKit.UIImage&gt;' toMonotouch.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));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-15
          • 2012-06-14
          相关资源
          最近更新 更多