Как использовать каталог ресурсов изображений в библиотеке cocoapod для iOS

У меня есть библиотека cocoapod, которая содержит активы в двух форматах:

  • a.storyboard
  • Каталог активов XCode.xcassets(с изображениями)

В моем файле podspec содержится определение для ресурсного пакета:

s.resource_bundle = {'SparkSetup' => ['Resources/**/*.{xcassets,storyboard}']}

и у меня есть отдельная цель в проекте pod, чтобы создать пакет ресурсов, используя эти файлы + файл plist для этого пакета.

Дело в том, что, когда я использую pod в проекте приложения, я могу видеть файлы раскадровки /xcassets, находящиеся в целевой программе, и я могу легко получить доступ и запустить раскадровку, но изображения, на которые ссылаются в раскадровке (на .xcassets файл) не отображаются во время выполнения (но отображаются правильно в IB).

Ошибка:

Could not load the "spinner" image referenced from a nib in the bundle with identifier "(null)"

Я вижу файл пакета в каталоге продуктов. Чтобы внедрить VC в раскадровку, я использую:

+(NSBundle *)getResourcesBundle
{
    NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"SparkSetup" withExtension:@"bundle"]];
    return bundle;
}


+(UIStoryboard *)getSetupStoryboard
{
    UIStoryboard *setupStoryboard = [UIStoryboard storyboardWithName:@"setup" bundle:[SparkSetupMainController getResourcesBundle]];
    return setupStoryboard;
}

который, кажется, хорошо работает для поиска раскадровки, но не для поиска изображений в .xcassets в том же комплекте.

Что я делаю неправильно? как я могу ссылаться на изображения из этой раскадровки/из кода и быть в состоянии интегрировать этот UI-модуль в любое приложение?

Спасибо!

Ответы

Ответ 1

Как минимум, начиная с версии 1.0.1 Cocoapods, поддерживаются каталоги файлов изображений.

В моем коде Swift я использовал:

public static var GoogleIcon:UIImage {
    let bundle = NSBundle(forClass: self)
    Log.msg("bundle: \(bundle)")
    return UIImage(named: "GoogleIcon", inBundle: bundle,compatibleWithTraitCollection: nil)!
}

В моей спецификации pod я использовал:

s.resources = "SMCoreLib/Assets/*.xcassets"

Когда я создаю с помощью симулятора, файл .car появляется в Framework:

cd /Users/<snip>/SMCoreLib.framework 
ls
Assets.car  Info.plist  SMCoreLib

Ответ 2

Ну, каталоги объектов изображений не поддерживаются через pods - просто включите пакет ресурсов, который содержит ваши файлы изображений в вашем podspec, например:

s.subspec 'Resources' do |resources|
    resources.resource_bundle = {'MyBundle' => ['Resources/**/*.{png}']}

end

и безопасно получить доступ к изображениям из этого контейнера:

+(NSBundle *)getResourcesBundle
{
    NSBundle *bundle = [NSBundle bundleWithURL:[[NSBundle bundleForClass:[self class]] URLForResource:@"MyBundle" withExtension:@"bundle"]];
    return bundle;
}


+(UIImage *)loadImageFromResourceBundle:(NSString *)imageName
{
    NSBundle *bundle = [MyClass getResourcesBundle];
    NSString *imageFileName = [NSString stringWithFormat:@"%@.png",imageName];
    UIImage *image = [UIImage imageNamed:imageFileName inBundle:bundle compatibleWithTraitCollection:nil];
    return image;
}

Это решает все проблемы обработки изображений/ресурсов внутри cocoapod.

Ответ 3

если вы используете swift.

class func loadImage(name: String) -> UIImage? {
    let podBundle = NSBundle(forClass: MyClass.self)
    if let url = podBundle.URLForResource("MyBundleName", withExtension: "bundle") {
        let bundle = NSBundle(URL: url)
        return UIImage(named: name, inBundle: bundle, compatibleWithTraitCollection: nil)
    }
    return nil
}

Ответ 4

версия Swift 3

private func getImageFromBundle(name: String) -> UIImage {
   let podBundle = Bundle(for: YourClass.self)
   if let url = podBundle.url(forResource: "YourClass", withExtension: "bundle") {
      let bundle = Bundle(url: url)
      return UIImage(named: name, in: bundle, compatibleWith: nil)!
   }
   return UIImage()
}