Mobile Anwendung sollten möglichst viel asynchron machen. Das gilt auch für das Nachladen von Bildern aus dem Web. Leider bringt MonoTouch bzw iOS keine ImageView mit, die das von sich aus könnte.
Also muss man die vorhandene UIImageView erweitern. Wie das mit MonoTouch geht zeigt die folgende Klasse:
Alles anzeigen
Die ImageView zeigt während des Ladens des eigentlichen Bildes eine Activity Indicator an und ersetzt diesen, sobald das Bild komplett geladen ist.
Also muss man die vorhandene UIImageView erweitern. Wie das mit MonoTouch geht zeigt die folgende Klasse:
Quellcode
- using System;
- using MonoTouch.Foundation;
- using MonoTouch.UIKit;
- using System.Drawing;
- namespace your.space
- {
- public partial class UIWebImageView : UIImageView
- {
- NSMutableData imageData;
- UIActivityIndicatorView indicatorView;
- public UIWebImageView (IntPtr handle) : base(handle)
- {
- Initialize ();
- }
- [Export("initWithCoder:")]
- public UIWebImageView (NSCoder coder) : base(coder)
- {
- Initialize ();
- }
- public UIWebImageView (RectangleF frame)
- {
- Initialize ();
- indicatorView.Frame = new RectangleF (frame.Size.Width / 2, frame.Size.Height / 2, indicatorView.Frame.Size.Width, indicatorView.Frame.Size.Height);
- }
- public UIWebImageView (RectangleF frame, string url) : base(frame)
- {
- Initialize ();
- Frame = frame;
- DownloadImage (url);
- }
- void Initialize ()
- {
- indicatorView = new UIActivityIndicatorView (UIActivityIndicatorViewStyle.Gray);
- indicatorView.HidesWhenStopped = true;
- var width = (this.Frame.Width - 20) / 2;
- var height = (this.Frame.Height - 20) / 2;
- indicatorView.Frame = new RectangleF (width, height, 20, 20);
- this.AddSubview (indicatorView);
- }
- public void DownloadImage (string url)
- {
- indicatorView.StartAnimating ();
- InvokeOnMainThread (delegate {
- NSUrlRequest request = new NSUrlRequest (new NSUrl (url));
- new NSUrlConnection (request, new ConnectionDelegate (this), true);
- });
- }
- class ConnectionDelegate : NSUrlConnectionDelegate
- {
- UIWebImageView view;
- public ConnectionDelegate (UIWebImageView view)
- {
- this.view = view;
- }
- public override void ReceivedData (NSUrlConnection connection, NSData data)
- {
- if (view.imageData == null)
- view.imageData = new NSMutableData ();
- view.imageData.AppendData (data);
- }
- public override void FinishedLoading (NSUrlConnection connection)
- {
- InvokeOnMainThread (delegate {
- view.indicatorView.StopAnimating ();
- UIImage downloadedImage = UIImage.LoadFromData (view.imageData);
- view.imageData = null;
- view.Image = downloadedImage;
- });
- }
- }
- }
- }
Die ImageView zeigt während des Ladens des eigentlichen Bildes eine Activity Indicator an und ersetzt diesen, sobald das Bild komplett geladen ist.
7.764 mal gelesen