Cela fait 4 ans que cette question a été répondu par 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 manquer quelque chose de vraiment simple.
Pas un liner, mais avec très peu de lignes, vous pouvez rouler le vôtre. 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.
Avec le nouveau support wait/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");
Vous voulez être sûr de charger l'image asynchrone afin de ne pas bloquer votre thread d'interface utilisateur. MonoTouch.Dialog inclut une classe ImageLoader (voir sec 5.3) que vous pourriez utiliser.
Il existe également quelques variantes de rlImageStore pour aider au chargement asynchrone des images.
Enfin, si vous voulez le faire manuellement, il existe une Xamarin Recipe que vous pouvez utiliser.
J'ai essayé ce qui précède, cela ressemble à une excellente idée, mais j'obtiens: Impossible de convertir implicitement le type System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to
Monotouch.UIKit.UIImage '
[a trouvé une solution] Le problème était que le
obj.Image = attendez cela.LoadImage (imageUrl) doit également être dans une méthode marquée async. Alors ça marche!
Merci
Le code ci-dessous devrait fonctionner,
public static async Task<UIImage> LoadImage(string imageUrl)
{
var httpClient = new HttpClient();
var contents = await httpClient.GetByteArrayAsync(imageUrl);
return UIImage.LoadFromData(NSData.FromArray(contents));
}