2015-09-14 2 views
6

У меня есть проект Xamarin в стиле MvvmCross. Есть подпроекты:Xamarin: Как загрузить изображение из проекта библиотеки iOS

  • ядро ​​(PCL)
  • ViewModel (PCL)
  • IOS (Executable)

Если я добавить изображение в мой проект IOS (Resoureces/Images/test_image. PNG), то я могу загрузить его с этим кодом:

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

Теперь я хочу использовать новый подпроект

  • управления (IOS библиотека)

Эта библиотека должна загрузить изображение. Я добавил изображение в Controls (Resusreces/Images/test_image.png)

Но я не могу загрузить это изображение в Controls proj.

Мой вопрос: Как загрузить изображения из iOS-библиотек?

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

и класс ViewController является:

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

enter image description here

Вот полный проектируемый: https://bitbucket.org/ww_wschaefer/xamarin-first-crossover-app/overview

+1

Вы не можете использовать из комплекта, если его доступен как bundeled ресурс, я думаю, вы бы лучше использовать 'UIImage.FromFile («Images/test_icon.png») '. Вы также должны посмотреть на этот [Вопрос] (http://stackoverflow.com/q/18130779/1155650). –

+1

Я не могу поверить, решение так просто, спасибо Рохит. – iOSfleer

+0

рад, что ваша проблема решена. Я добавил объяснение, если вы заинтересованы. –

ответ

8

Небольшое пояснение на мой комментарий.

Вы должны изменить

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

в

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

Поскольку изображение не добавляется в качестве комплектного ресурса.

Метод UIImage.FromFile() загружает изображение асинхронно. Он также позволяет приложению загружать изображение из внешнего местоположения.

В отличии от метода UIImage.FromFile(), метод UIImage.FromBundle() является блокирующим вызовом и загружает только изображения внутри пакета приложения. Тем не менее, он кэширует изображения после загрузки.

Для дальнейшего понимания взглянуть на книгу - Developing C# Apps for iPhone and iPad using MonoTouch

+0

@iOSfleer - Не могли бы вы подтвердить, что это решение, которое сработало для вас? –