2013-07-23 38 views

Trả lời

50

Không phải là một lớp lót, nhưng với rất ít dòng bạn có thể cuộn của riêng bạn. Ví dụ.

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

Cuộc gọi, bao gồm cuộc gọi từ số UIImage, an toàn chỉ.

+0

Khi tôi thử điều này với một url như https://www.google.ca/images/srpr/logo11w.png tôi nhận được "Không thể khởi tạo một thể hiện của loại 'MonoTouch.Foundation. NSUrl ': phương thức' initWithString: 'nguyên gốc được trả về nil. " Bất kỳ ý tưởng tại sao điều đó xảy ra? – user2320724

+0

'NSUrl' sẽ ném (trả về' nil' trong ObjC) thì URL được cung cấp không hợp lệ (không tuân thủ RFC 2396). Xem tài liệu của Apple @ https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURL/initWithString: – poupou

5

Bạn muốn chắc chắn rằng bạn tải hình ảnh không đồng bộ để bạn không chặn chuỗi giao diện người dùng của mình. MonoTouch.Dialog bao gồm một lớp học ImageLoader (xem giây 5.3) mà bạn có thể sử dụng.

Ngoài ra còn có một vài biến thể của UrlImageStore ngoài đó để giúp tải ảnh không đồng bộ.

Cuối cùng, nếu bạn muốn thực hiện thủ công, có Xamarin Recipe bạn có thể sử dụng.

27

Với sự hỗ trợ đang chờ đợi/async mới, bạn có thể làm:

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

và bạn gọi này với:

someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url"); 
+3

byte [] contents = chờ đợi httpClient.GetByteArrayAsync (imageUrl); – winnicki

1

tôi đã cố gắng trên, nó trông giống như một ý tưởng tuyệt vời, nhưng tôi nhận được: Không thể chuyển đổi hoàn toàn loại System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKit.UIImage '

[tìm thấy giải pháp] Vấn đề là do
obj.Image = await this.LoadImage (imageUrl) cũng phải nằm trong một phương thức được đánh dấu là không đồng bộ. Sau đó, nó hoạt động!

Cảm ơn

Các vấn đề liên quan