2015-09-15 12 views
12

ho avere una biblioteca che contiene cocoapod attività in 2 formati:Come utilizzare le immagini catalogo di asset nella libreria cocoapod per iOS

  • un .storyboard
  • XCode di attività Catalogo .xcassets (con immagini)

mio file podspec contiene la definizione per il pacchetto di risorse:

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

e ho una destinazione separata nel progetto pod per creare un pacchetto di risorse usando quei file + un file plist per quel pacchetto.

è che quando utilizzo il pod in un progetto di app, posso vedere i file storyboard/xcassets che si trovano nel target del pod e posso accedere ed eseguire facilmente lo storyboard ma le immagini fanno riferimento nello storyboard (al file. file xcassets) non vengono trovati in fase di esecuzione (ma visualizzati correttamente in IB).

errore che ottengo è:

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

Vedo un file pacchetto nella directory prodotti. Per instanciate VC nello storyboard che uso:

+(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; 
} 

che sembra funzionare bene per trovare la storyboard, ma non per la ricerca di immagini nelle .xcassets nello stesso fascio.

Cosa sto sbagliando? come posso fare riferimento a immagini da questo storyboard/da codice e essere in grado di integrare questo pod UI in qualsiasi app?

Grazie!

+0

Avendo la stessa identica problema. Ho notato che se ho usato le immagini senza un catalogo di risorse funziona correttamente. – bencallis

+1

@bencallis a quanto pare questa è l'unica soluzione. XCode non sembra fare riferimento a un catalogo di risorse che non è caricato nel pacchetto di app principale .. la soluzione è solo di cambiare la linea resource_bundle in podspec per includere '.png's e non' .xcasset' e fare riferimento a ciascuna immagine singolarmente. non perfetto ma questo è l'unico modo in cui funziona .. – mindbomb

+0

Anche provare questo problema. Non è nemmeno possibile caricare immagini con imageNamed da un catalogo xcasset all'interno del pod. :( – Jure

risposta

7

Beh, cataloghi di immagini di attività non sono supportati tramite cialde - solo includono un pacchetto di risorse che contiene i file di immagine nel vostro podspec in questo modo:

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

end 

e accedere alle immagini in modo sicuro dal baccello così:

+(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; 
} 

Questo risolve tutti i problemi relativi alla gestione di immagini/risorse all'interno di un cocoapod.

+2

è possibile ottenere le immagini dallo storyboard in questo modo? – swalkner

+0

@swalkner nello storyboard devi aggiungere '' 'MyBundleName.bundle/ .png''' in id' '' UIImageView''', sarà disponibile solo in runtime Non è possibile visualizzarlo in anteprima –

3

se si utilizza 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 
} 
17

Almeno a partire dalla versione 1.0.1 di Cocoapods, i cataloghi di risorse immagine sono supportati.

Nel mio codice Swift, ho usato:

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

Nel mio pod spec, ho usato:

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

quando costruire utilizzando il simulatore, il.file di auto fa presentarsi nel quadro:

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

Effettivamente ora funziona .. – mindbomb

+1

s.resources = "SMCoreLib/Assets/* .xcassets" questo mi ha salvato tempo, grazie :) –

+0

Sì, ma questo include risorse all'interno della destinazione dell'applicazione non come parte del framework Pod. – MichK

1

Swift 3 versione

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

Aggiornamento per 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") 
    } 

quindi utilizzarlo come di seguito:

ImagesHelper.myImage 

Come in risposta 's il @Chris Prince, non dimenticare di aggiornare il file podspec come: (Definire il percorso esatto del file xcassets in base alla configurazione del progetto)

s.resource_bundles = { 
    'YourPodName' => ['YourPodName/Assets/Assets.xcassets'] 
    } 
Problemi correlati