Xamarin: How to load image from iOS library projec

2019-06-18 06:37发布

问题:

I have a Xamarin Project styled with MvvmCross. There are Subprojects:

  • Core (PCL)
  • ViewModel (PCL)
  • iOS (Executable)

If i add an image to my iOS project (Resoureces/Images/test_image.png), then i can load it with this code:

UIImage image = UIImage.FromBundle("Images/test_icon.png");

Now, i want to use a new Subproject

  • Controls (iOS Library)

This library should load an image. I added an image to Controls (Resoureces/Images/test_image.png)

But i can not load this image in Controls proj.

My Question: How to load images from iOS libraries?

    public class MyButton : UIButton
    {
        public MyButton () : base()
        {
            Initialize ();
        }

        void Initialize()
        {
            // load image from bundle
            UIImage image = UIImage.FromBundle("Images/test_icon.png");
            // image is null
            this.SetImage (image, UIControlState.Normal);
        }
    }

and the ViewController class is :

    public partial class FirstView : MvxViewController
    {
        public FirstView () : base ("FirstView", null)
        {
        }

        public override void ViewDidLoad ()
        {
            base.ViewDidLoad ();

            // load image from bundle
//          UIImage image = UIImage.FromBundle("Images/test_icon.png");
//          image is not null if added in iOS Proj
//          this.imageView.Image = image;

            MyButton button = new MyButton ();

            View.Add (button);

            View.AddConstraint (NSLayoutConstraint.Create (button, NSLayoutAttribute.Right, NSLayoutRelation.Equal, View, NSLayoutAttribute.Right, 1, 10));
            View.AddConstraint (NSLayoutConstraint.Create (button, NSLayoutAttribute.Top, NSLayoutRelation.Equal, View, NSLayoutAttribute.Top, 1, 74));
            View.AddConstraint (NSLayoutConstraint.Create (button, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 0, 64)); 
            View.AddConstraint (NSLayoutConstraint.Create (button, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 0, 64)); 
        }
    }

Here is full proj: https://bitbucket.org/ww_wschaefer/xamarin-first-crossover-app/overview

回答1:

A little explanation on my comment.

You have to change

UIImage image = UIImage.FromBundle("Images/test_icon.png");

to

UIImage image = UIImage.FromFile("Images/test_icon.png");

As the image is not added as bundled resource.

The UIImage.FromFile() method loads the image asynchronously. It also allows the application to load the image from an external location.

Unlike the UIImage.FromFile() method, the UIImage.FromBundle() method is a blocking call and only loads images from within the application bundle. However, it caches the images after loading it.

For further understanding have a look at the book - Developing C# Apps for iPhone and iPad using MonoTouch