UIImage loaded from URL in Xamarin / C#

cela fait 4 ans que cette question a reçu la réponse ce billet de blog .

Existe-t-il un moyen standard de créer un UIImage avec une image à partir d'une URL? Quelque chose comme:

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

j'ai l'impression de rater quelque chose de très simple.

24
demandé sur Community 2013-07-24 01:25:14

4 réponses

pas une seule doublure, mais avec très peu de lignes vous pouvez rouler votre propre. Par exemple:

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

Les appels, y compris celui de UIImage , sont thread-safe.

52
répondu poupou 2013-07-24 00:15:34

avec le nouveau support d'attente/async vous pouvez faire:

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));
        }

et vous appelez cela avec:

someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url");
27
répondu Pavel Sich 2013-10-18 22:45:06

vous voulez être sûr que vous chargez l'image async de sorte que vous ne bloquez pas votre UI thread. MonoTouch.Dialog inclut une classe ImageLoader (voir sec 5.3) que vous pouvez utiliser.

Il ya aussi un couple de variations de UrlImageStore là-bas pour aider avec les images de chargement async.

enfin, si vous voulez le faire manuellement, il y a une recette de Xamarin que vous pouvez utiliser.

5
répondu Jason 2013-07-23 21:34:18

j'ai essayé ci-dessus, il ressemble à une grande idée, mais je reçois: Ne peut pas convertir implicitement le type System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage '

[trouvé une solution] Le problème était que le

obj.Image = attendez ceci.LoadImage (imageUrl) doit également être une méthode marquée asynchrone. Puis il travaille!

Merci

1
répondu Scott Emick 2014-01-09 03:03:34