2015-09-15 2 views
12

У меня есть библиотека, которая содержит cocoapod активов в 2-х форматах:Как использовать изображения каталог активов в cocoapod библиотеки прошивки

  • а .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)" 

я вижу файл связки в каталоге продукции. Для VCs в создании экземпляра раскадровки я использую:

+(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-модуль в любое приложение?

Спасибо!

+0

Имея тот же самый вопрос. Я заметил, что если я использовал изображения без каталога активов, он работает нормально. – bencallis

+1

@ bencallis, по-видимому, это единственное решение. XCode не может ссылаться на каталог активов, который не загружен в основной пакет приложений. Единственное решение - изменить строку resource_bundle в podspec, чтобы включить '.png', а не '.ccasset' и ссылаться на каждое изображение отдельно. не идеально, но это единственный способ, которым это работает. – mindbomb

+0

Испытывать эту проблему. Невозможно даже загрузить изображения с помощью imageNamed из каталога xcasset внутри контейнера. :( – Jure

ответ

7

Ну, каталоги изображений активов не поддерживаются с помощью стручков - просто включить набор ресурсов, который содержит файлы изображений в вашей 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.

+2

возможно ли получить изображения из раскадровки так же? – swalkner

+0

@swalkner в раскадровке вам нужно добавить '' 'MyBundleName.bundle/ .png''' в' '' UIImageView''' id изображения, он будет доступен только во время выполнения. Невозможно просмотреть его. –

3

если вы используете быстрый.

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 
} 
17

По крайней мере, начиная с версии 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)! 
} 

В моей стручок спецификации, я использовал:

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

Когда я строю с помощью имитатора.автомобиль файл делает показать в рамках:

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

Действительно, теперь это работает. – mindbomb

+1

s.resources = "SMCoreLib/Assets/*. xcassets" это спасло мое время, спасибо :) –

+0

Да, но это включает ресурсы внутри целевого объекта приложения не как часть структуры Pod. – MichK

1

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() 
} 
0

Обновление для Swift 4

public struct ImagesHelper { 
    private static var podsBundle: Bundle { 
    return Bundle(for: YourClass.self) 
    } 

    private static func imageFor(name imageName: String) -> UIImage { 
    return UIImage.init(named: imageName, in: podsBundle, compatibleWith: nil)! 
    } 

    public static var myImage: UIImage { 
    return imageFor(name: "imageName") 
    } 

Затем используйте его, как показано ниже:

ImagesHelper.myImage 

Как и в ответе @Chris Prince «s, не забудьте обновить файл podspec как: (Определить точный путь файла xcassets в соответствии с вашими настройками проекта)

s.resource_bundles = { 
    'YourPodName' => ['YourPodName/Assets/Assets.xcassets'] 
    } 
Смежные вопросы