MonoTouch asynchrone UIImageView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Der folgende Artikel zeigt, wie man die UIImageView erweitern kann, um Bilder asynchron aus dem Web nachzuladen.
    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:

    Quellcode

    1. using System;
    2. using MonoTouch.Foundation;
    3. using MonoTouch.UIKit;
    4. using System.Drawing;
    5. namespace your.space
    6. {
    7. public partial class UIWebImageView : UIImageView
    8. {
    9. NSMutableData imageData;
    10. UIActivityIndicatorView indicatorView;
    11. public UIWebImageView (IntPtr handle) : base(handle)
    12. {
    13. Initialize ();
    14. }
    15. [Export("initWithCoder:")]
    16. public UIWebImageView (NSCoder coder) : base(coder)
    17. {
    18. Initialize ();
    19. }
    20. public UIWebImageView (RectangleF frame)
    21. {
    22. Initialize ();
    23. indicatorView.Frame = new RectangleF (frame.Size.Width / 2, frame.Size.Height / 2, indicatorView.Frame.Size.Width, indicatorView.Frame.Size.Height);
    24. }
    25. public UIWebImageView (RectangleF frame, string url) : base(frame)
    26. {
    27. Initialize ();
    28. Frame = frame;
    29. DownloadImage (url);
    30. }
    31. void Initialize ()
    32. {
    33. indicatorView = new UIActivityIndicatorView (UIActivityIndicatorViewStyle.Gray);
    34. indicatorView.HidesWhenStopped = true;
    35. var width = (this.Frame.Width - 20) / 2;
    36. var height = (this.Frame.Height - 20) / 2;
    37. indicatorView.Frame = new RectangleF (width, height, 20, 20);
    38. this.AddSubview (indicatorView);
    39. }
    40. public void DownloadImage (string url)
    41. {
    42. indicatorView.StartAnimating ();
    43. InvokeOnMainThread (delegate {
    44. NSUrlRequest request = new NSUrlRequest (new NSUrl (url));
    45. new NSUrlConnection (request, new ConnectionDelegate (this), true);
    46. });
    47. }
    48. class ConnectionDelegate : NSUrlConnectionDelegate
    49. {
    50. UIWebImageView view;
    51. public ConnectionDelegate (UIWebImageView view)
    52. {
    53. this.view = view;
    54. }
    55. public override void ReceivedData (NSUrlConnection connection, NSData data)
    56. {
    57. if (view.imageData == null)
    58. view.imageData = new NSMutableData ();
    59. view.imageData.AppendData (data);
    60. }
    61. public override void FinishedLoading (NSUrlConnection connection)
    62. {
    63. InvokeOnMainThread (delegate {
    64. view.indicatorView.StopAnimating ();
    65. UIImage downloadedImage = UIImage.LoadFromData (view.imageData);
    66. view.imageData = null;
    67. view.Image = downloadedImage;
    68. });
    69. }
    70. }
    71. }
    72. }
    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.

    2.064 mal gelesen