Как использовать каталог ресурсов изображений в библиотеке 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()
}